
#ifndef JSTD_FAST_DIV_H
#define JSTD_FAST_DIV_H

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#if defined(_MSC_VER)
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <math.h>
#include <assert.h>

#include <cstdint>
#include <cstddef>
#include <cstdbool>
#include <algorithm>

#include "jstd/DivUtils.h"
#include "jstd/FastMod.h"

//
// Articles and documents
//
// https://zhuanlan.zhihu.com/p/151038723 (This article is very nice)
//
// Integer Division: Barrett Reduction & Lemire Reduction (There is a new (2019) method)
//
// PDF: [Lemire et al. 2019](https://arxiv.org/abs/1902.01961)
//
//
// See: https://en.algorithmica.org/hpc/arithmetic/division/
//
// https://github.com/rubenvannieuwpoort/division-by-constant-integers/
// https://github.com/rubenvannieuwpoort/division-by-constant-integers/blob/master/unsigned/runtime/unsigned_division.h
//
// https://stackoverflow.com/questions/45353629/repeated-integer-division-by-a-runtime-constant-value
//
// PDF: Integer Division by Constants: Optimal Bounds
//      https://arxiv.org/abs/2012.12369
//
// PDF: Division by Invariant Integers using Multiplication
//      http://gmplib.org/~tege/divcnst-pldi94.pdf
//
// See: https://www.cnblogs.com/shines77/p/4189074.html
// See: https://bbs.emath.ac.cn/thread-521-3-1.html (liangbch)
//
// (English? Aliyun.com)
// See: https://topic.alibabacloud.com/a/how-does-the-compiler-implement-constant-integer-division-optimization-for-32-bit-integers-c--_1_31_30483239.html
//

namespace jstd {

static const std::uint32_t kMaxDivTable = 512;

struct DivRatio32_v1 {
    uint32_t inverse;
    uint32_t shift;
};

struct DivRatio32 {
    uint32_t inverse;
    uint32_t bias;
    uint32_t shift;
    uint32_t reserve;
};

struct DivRatio32_64 {
    uint64_t inverse;
    uint32_t shift;
    uint32_t reserve;
};

struct DivRatio64 {
    uint64_t inverse;
    uint64_t bias;
    uint32_t shift;
    uint32_t reserve;
};

static const DivRatio32_v1 div_ratio_tbl32_v1[kMaxDivTable] = {
    { /*   0 */ 0x00000000,  0 }, { /*   1 */ 0xFFFFFFFF,  0 },
    { /*   2 */ 0x80000000,  0 }, { /*   3 */ 0xAAAAAAAB,  1 },
    { /*   4 */ 0x40000000,  0 }, { /*   5 */ 0xCCCCCCCD,  2 },
    { /*   6 */ 0xAAAAAAAB,  2 }, { /*   7 */ 0x92492493,  2 },
    { /*   8 */ 0x20000000,  0 }, { /*   9 */ 0xE38E38E4,  3 },
    { /*  10 */ 0xCCCCCCCD,  3 }, { /*  11 */ 0xBA2E8BA3,  3 },
    { /*  12 */ 0xAAAAAAAB,  3 }, { /*  13 */ 0x9D89D89E,  3 },
    { /*  14 */ 0x92492493,  3 }, { /*  15 */ 0x88888889,  3 },
    { /*  16 */ 0x10000000,  0 }, { /*  17 */ 0xF0F0F0F1,  4 },
    { /*  18 */ 0xE38E38E4,  4 }, { /*  19 */ 0xD79435E6,  4 },
    { /*  20 */ 0xCCCCCCCD,  4 }, { /*  21 */ 0xC30C30C4,  4 },
    { /*  22 */ 0xBA2E8BA3,  4 }, { /*  23 */ 0xB21642C9,  4 },
    { /*  24 */ 0xAAAAAAAB,  4 }, { /*  25 */ 0xA3D70A3E,  4 },
    { /*  26 */ 0x9D89D89E,  4 }, { /*  27 */ 0x97B425EE,  4 },
    { /*  28 */ 0x92492493,  4 }, { /*  29 */ 0x8D3DCB09,  4 },
    { /*  30 */ 0x88888889,  4 }, { /*  31 */ 0x84210843,  4 },
    { /*  32 */ 0x08000000,  0 }, { /*  33 */ 0xF83E0F84,  5 },
    { /*  34 */ 0xF0F0F0F1,  5 }, { /*  35 */ 0xEA0EA0EB,  5 },
    { /*  36 */ 0xE38E38E4,  5 }, { /*  37 */ 0xDD67C8A7,  5 },
    { /*  38 */ 0xD79435E6,  5 }, { /*  39 */ 0xD20D20D3,  5 },
    { /*  40 */ 0xCCCCCCCD,  5 }, { /*  41 */ 0xC7CE0C7D,  5 },
    { /*  42 */ 0xC30C30C4,  5 }, { /*  43 */ 0xBE82FA0C,  5 },
    { /*  44 */ 0xBA2E8BA3,  5 }, { /*  45 */ 0xB60B60B7,  5 },
    { /*  46 */ 0xB21642C9,  5 }, { /*  47 */ 0xAE4C415D,  5 },
    { /*  48 */ 0xAAAAAAAB,  5 }, { /*  49 */ 0xA72F053A,  5 },
    { /*  50 */ 0xA3D70A3E,  5 }, { /*  51 */ 0xA0A0A0A1,  5 },
    { /*  52 */ 0x9D89D89E,  5 }, { /*  53 */ 0x9A90E7DA,  5 },
    { /*  54 */ 0x97B425EE,  5 }, { /*  55 */ 0x94F20950,  5 },
    { /*  56 */ 0x92492493,  5 }, { /*  57 */ 0x8FB823EF,  5 },
    { /*  58 */ 0x8D3DCB09,  5 }, { /*  59 */ 0x8AD8F2FC,  5 },
    { /*  60 */ 0x88888889,  5 }, { /*  61 */ 0x864B8A7E,  5 },
    { /*  62 */ 0x84210843,  5 }, { /*  63 */ 0x82082083,  5 },
    { /*  64 */ 0x04000000,  0 }, { /*  65 */ 0xFC0FC0FD,  6 },
    { /*  66 */ 0xF83E0F84,  6 }, { /*  67 */ 0xF4898D60,  6 },
    { /*  68 */ 0xF0F0F0F1,  6 }, { /*  69 */ 0xED7303B6,  6 },
    { /*  70 */ 0xEA0EA0EB,  6 }, { /*  71 */ 0xE6C2B449,  6 },
    { /*  72 */ 0xE38E38E4,  6 }, { /*  73 */ 0xE070381D,  6 },
    { /*  74 */ 0xDD67C8A7,  6 }, { /*  75 */ 0xDA740DA8,  6 },
    { /*  76 */ 0xD79435E6,  6 }, { /*  77 */ 0xD4C77B04,  6 },
    { /*  78 */ 0xD20D20D3,  6 }, { /*  79 */ 0xCF6474A9,  6 },
    { /*  80 */ 0xCCCCCCCD,  6 }, { /*  81 */ 0xCA4587E7,  6 },
    { /*  82 */ 0xC7CE0C7D,  6 }, { /*  83 */ 0xC565C87C,  6 },
    { /*  84 */ 0xC30C30C4,  6 }, { /*  85 */ 0xC0C0C0C1,  6 },
    { /*  86 */ 0xBE82FA0C,  6 }, { /*  87 */ 0xBC52640C,  6 },
    { /*  88 */ 0xBA2E8BA3,  6 }, { /*  89 */ 0xB81702E1,  6 },
    { /*  90 */ 0xB60B60B7,  6 }, { /*  91 */ 0xB40B40B5,  6 },
    { /*  92 */ 0xB21642C9,  6 }, { /*  93 */ 0xB02C0B03,  6 },
    { /*  94 */ 0xAE4C415D,  6 }, { /*  95 */ 0xAC769185,  6 },
    { /*  96 */ 0xAAAAAAAB,  6 }, { /*  97 */ 0xA8E83F58,  6 },
    { /*  98 */ 0xA72F053A,  6 }, { /*  99 */ 0xA57EB503,  6 },
    { /* 100 */ 0xA3D70A3E,  6 }, { /* 101 */ 0xA237C32C,  6 },
    { /* 102 */ 0xA0A0A0A1,  6 }, { /* 103 */ 0x9F1165E8,  6 },
    { /* 104 */ 0x9D89D89E,  6 }, { /* 105 */ 0x9C09C09D,  6 },
    { /* 106 */ 0x9A90E7DA,  6 }, { /* 107 */ 0x991F1A52,  6 },
    { /* 108 */ 0x97B425EE,  6 }, { /* 109 */ 0x964FDA6D,  6 },
    { /* 110 */ 0x94F20950,  6 }, { /* 111 */ 0x939A85C5,  6 },
    { /* 112 */ 0x92492493,  6 }, { /* 113 */ 0x90FDBC0A,  6 },
    { /* 114 */ 0x8FB823EF,  6 }, { /* 115 */ 0x8E78356E,  6 },
    { /* 116 */ 0x8D3DCB09,  6 }, { /* 117 */ 0x8C08C08D,  6 },
    { /* 118 */ 0x8AD8F2FC,  6 }, { /* 119 */ 0x89AE408A,  6 },
    { /* 120 */ 0x88888889,  6 }, { /* 121 */ 0x8767AB60,  6 },
    { /* 122 */ 0x864B8A7E,  6 }, { /* 123 */ 0x85340854,  6 },
    { /* 124 */ 0x84210843,  6 }, { /* 125 */ 0x83126E98,  6 },
    { /* 126 */ 0x82082083,  6 }, { /* 127 */ 0x81020409,  6 },
    { /* 128 */ 0x02000000,  0 }, { /* 129 */ 0xFE03F810,  7 },
    { /* 130 */ 0xFC0FC0FD,  7 }, { /* 131 */ 0xFA232CF3,  7 },
    { /* 132 */ 0xF83E0F84,  7 }, { /* 133 */ 0xF6603D99,  7 },
    { /* 134 */ 0xF4898D60,  7 }, { /* 135 */ 0xF2B9D649,  7 },
    { /* 136 */ 0xF0F0F0F1,  7 }, { /* 137 */ 0xEF2EB720,  7 },
    { /* 138 */ 0xED7303B6,  7 }, { /* 139 */ 0xEBBDB2A6,  7 },
    { /* 140 */ 0xEA0EA0EB,  7 }, { /* 141 */ 0xE865AC7C,  7 },
    { /* 142 */ 0xE6C2B449,  7 }, { /* 143 */ 0xE525982B,  7 },
    { /* 144 */ 0xE38E38E4,  7 }, { /* 145 */ 0xE1FC780F,  7 },
    { /* 146 */ 0xE070381D,  7 }, { /* 147 */ 0xDEE95C4D,  7 },
    { /* 148 */ 0xDD67C8A7,  7 }, { /* 149 */ 0xDBEB61EF,  7 },
    { /* 150 */ 0xDA740DA8,  7 }, { /* 151 */ 0xD901B204,  7 },
    { /* 152 */ 0xD79435E6,  7 }, { /* 153 */ 0xD62B80D7,  7 },
    { /* 154 */ 0xD4C77B04,  7 }, { /* 155 */ 0xD3680D37,  7 },
    { /* 156 */ 0xD20D20D3,  7 }, { /* 157 */ 0xD0B69FCC,  7 },
    { /* 158 */ 0xCF6474A9,  7 }, { /* 159 */ 0xCE168A78,  7 },
    { /* 160 */ 0xCCCCCCCD,  7 }, { /* 161 */ 0xCB8727C1,  7 },
    { /* 162 */ 0xCA4587E7,  7 }, { /* 163 */ 0xC907DA4F,  7 },
    { /* 164 */ 0xC7CE0C7D,  7 }, { /* 165 */ 0xC6980C6A,  7 },
    { /* 166 */ 0xC565C87C,  7 }, { /* 167 */ 0xC4372F86,  7 },
    { /* 168 */ 0xC30C30C4,  7 }, { /* 169 */ 0xC1E4BBD6,  7 },
    { /* 170 */ 0xC0C0C0C1,  7 }, { /* 171 */ 0xBFA02FE9,  7 },
    { /* 172 */ 0xBE82FA0C,  7 }, { /* 173 */ 0xBD691048,  7 },
    { /* 174 */ 0xBC52640C,  7 }, { /* 175 */ 0xBB3EE722,  7 },
    { /* 176 */ 0xBA2E8BA3,  7 }, { /* 177 */ 0xB92143FB,  7 },
    { /* 178 */ 0xB81702E1,  7 }, { /* 179 */ 0xB70FBB5B,  7 },
    { /* 180 */ 0xB60B60B7,  7 }, { /* 181 */ 0xB509E68B,  7 },
    { /* 182 */ 0xB40B40B5,  7 }, { /* 183 */ 0xB30F6353,  7 },
    { /* 184 */ 0xB21642C9,  7 }, { /* 185 */ 0xB11FD3B9,  7 },
    { /* 186 */ 0xB02C0B03,  7 }, { /* 187 */ 0xAF3ADDC7,  7 },
    { /* 188 */ 0xAE4C415D,  7 }, { /* 189 */ 0xAD602B59,  7 },
    { /* 190 */ 0xAC769185,  7 }, { /* 191 */ 0xAB8F69E3,  7 },
    { /* 192 */ 0xAAAAAAAB,  7 }, { /* 193 */ 0xA9C84A48,  7 },
    { /* 194 */ 0xA8E83F58,  7 }, { /* 195 */ 0xA80A80A9,  7 },
    { /* 196 */ 0xA72F053A,  7 }, { /* 197 */ 0xA655C43A,  7 },
    { /* 198 */ 0xA57EB503,  7 }, { /* 199 */ 0xA4A9CF1E,  7 },
    { /* 200 */ 0xA3D70A3E,  7 }, { /* 201 */ 0xA3065E40,  7 },
    { /* 202 */ 0xA237C32C,  7 }, { /* 203 */ 0xA16B312F,  7 },
    { /* 204 */ 0xA0A0A0A1,  7 }, { /* 205 */ 0x9FD809FE,  7 },
    { /* 206 */ 0x9F1165E8,  7 }, { /* 207 */ 0x9E4CAD24,  7 },
    { /* 208 */ 0x9D89D89E,  7 }, { /* 209 */ 0x9CC8E161,  7 },
    { /* 210 */ 0x9C09C09D,  7 }, { /* 211 */ 0x9B4C6F9F,  7 },
    { /* 212 */ 0x9A90E7DA,  7 }, { /* 213 */ 0x99D722DB,  7 },
    { /* 214 */ 0x991F1A52,  7 }, { /* 215 */ 0x9868C80A,  7 },
    { /* 216 */ 0x97B425EE,  7 }, { /* 217 */ 0x97012E03,  7 },
    { /* 218 */ 0x964FDA6D,  7 }, { /* 219 */ 0x95A02569,  7 },
    { /* 220 */ 0x94F20950,  7 }, { /* 221 */ 0x94458095,  7 },
    { /* 222 */ 0x939A85C5,  7 }, { /* 223 */ 0x92F11385,  7 },
    { /* 224 */ 0x92492493,  7 }, { /* 225 */ 0x91A2B3C5,  7 },
    { /* 226 */ 0x90FDBC0A,  7 }, { /* 227 */ 0x905A3864,  7 },
    { /* 228 */ 0x8FB823EF,  7 }, { /* 229 */ 0x8F1779DA,  7 },
    { /* 230 */ 0x8E78356E,  7 }, { /* 231 */ 0x8DDA5203,  7 },
    { /* 232 */ 0x8D3DCB09,  7 }, { /* 233 */ 0x8CA29C05,  7 },
    { /* 234 */ 0x8C08C08D,  7 }, { /* 235 */ 0x8B70344B,  7 },
    { /* 236 */ 0x8AD8F2FC,  7 }, { /* 237 */ 0x8A42F871,  7 },
    { /* 238 */ 0x89AE408A,  7 }, { /* 239 */ 0x891AC73B,  7 },
    { /* 240 */ 0x88888889,  7 }, { /* 241 */ 0x87F78088,  7 },
    { /* 242 */ 0x8767AB60,  7 }, { /* 243 */ 0x86D90545,  7 },
    { /* 244 */ 0x864B8A7E,  7 }, { /* 245 */ 0x85BF3762,  7 },
    { /* 246 */ 0x85340854,  7 }, { /* 247 */ 0x84A9F9C9,  7 },
    { /* 248 */ 0x84210843,  7 }, { /* 249 */ 0x83993053,  7 },
    { /* 250 */ 0x83126E98,  7 }, { /* 251 */ 0x828CBFBF,  7 },
    { /* 252 */ 0x82082083,  7 }, { /* 253 */ 0x81848DA9,  7 },
    { /* 254 */ 0x81020409,  7 }, { /* 255 */ 0x80808081,  7 },
    { /* 256 */ 0x01000000,  0 }, { /* 257 */ 0xFF00FF01,  8 },
    { /* 258 */ 0xFE03F810,  8 }, { /* 259 */ 0xFD08E551,  8 },
    { /* 260 */ 0xFC0FC0FD,  8 }, { /* 261 */ 0xFB188566,  8 },
    { /* 262 */ 0xFA232CF3,  8 }, { /* 263 */ 0xF92FB222,  8 },
    { /* 264 */ 0xF83E0F84,  8 }, { /* 265 */ 0xF74E3FC3,  8 },
    { /* 266 */ 0xF6603D99,  8 }, { /* 267 */ 0xF57403D6,  8 },
    { /* 268 */ 0xF4898D60,  8 }, { /* 269 */ 0xF3A0D52D,  8 },
    { /* 270 */ 0xF2B9D649,  8 }, { /* 271 */ 0xF1D48BCF,  8 },
    { /* 272 */ 0xF0F0F0F1,  8 }, { /* 273 */ 0xF00F00F1,  8 },
    { /* 274 */ 0xEF2EB720,  8 }, { /* 275 */ 0xEE500EE6,  8 },
    { /* 276 */ 0xED7303B6,  8 }, { /* 277 */ 0xEC979119,  8 },
    { /* 278 */ 0xEBBDB2A6,  8 }, { /* 279 */ 0xEAE56404,  8 },
    { /* 280 */ 0xEA0EA0EB,  8 }, { /* 281 */ 0xE9396520,  8 },
    { /* 282 */ 0xE865AC7C,  8 }, { /* 283 */ 0xE79372E3,  8 },
    { /* 284 */ 0xE6C2B449,  8 }, { /* 285 */ 0xE5F36CB1,  8 },
    { /* 286 */ 0xE525982B,  8 }, { /* 287 */ 0xE45932D8,  8 },
    { /* 288 */ 0xE38E38E4,  8 }, { /* 289 */ 0xE2C4A689,  8 },
    { /* 290 */ 0xE1FC780F,  8 }, { /* 291 */ 0xE135A9CA,  8 },
    { /* 292 */ 0xE070381D,  8 }, { /* 293 */ 0xDFAC1F75,  8 },
    { /* 294 */ 0xDEE95C4D,  8 }, { /* 295 */ 0xDE27EB2D,  8 },
    { /* 296 */ 0xDD67C8A7,  8 }, { /* 297 */ 0xDCA8F159,  8 },
    { /* 298 */ 0xDBEB61EF,  8 }, { /* 299 */ 0xDB2F171E,  8 },
    { /* 300 */ 0xDA740DA8,  8 }, { /* 301 */ 0xD9BA4257,  8 },
    { /* 302 */ 0xD901B204,  8 }, { /* 303 */ 0xD84A598F,  8 },
    { /* 304 */ 0xD79435E6,  8 }, { /* 305 */ 0xD6DF43FD,  8 },
    { /* 306 */ 0xD62B80D7,  8 }, { /* 307 */ 0xD578E97D,  8 },
    { /* 308 */ 0xD4C77B04,  8 }, { /* 309 */ 0xD417328A,  8 },
    { /* 310 */ 0xD3680D37,  8 }, { /* 311 */ 0xD2BA083C,  8 },
    { /* 312 */ 0xD20D20D3,  8 }, { /* 313 */ 0xD161543F,  8 },
    { /* 314 */ 0xD0B69FCC,  8 }, { /* 315 */ 0xD00D00D1,  8 },
    { /* 316 */ 0xCF6474A9,  8 }, { /* 317 */ 0xCEBCF8BC,  8 },
    { /* 318 */ 0xCE168A78,  8 }, { /* 319 */ 0xCD712753,  8 },
    { /* 320 */ 0xCCCCCCCD,  8 }, { /* 321 */ 0xCC29786D,  8 },
    { /* 322 */ 0xCB8727C1,  8 }, { /* 323 */ 0xCAE5D860,  8 },
    { /* 324 */ 0xCA4587E7,  8 }, { /* 325 */ 0xC9A633FD,  8 },
    { /* 326 */ 0xC907DA4F,  8 }, { /* 327 */ 0xC86A7891,  8 },
    { /* 328 */ 0xC7CE0C7D,  8 }, { /* 329 */ 0xC73293D8,  8 },
    { /* 330 */ 0xC6980C6A,  8 }, { /* 331 */ 0xC5FE7404,  8 },
    { /* 332 */ 0xC565C87C,  8 }, { /* 333 */ 0xC4CE07B1,  8 },
    { /* 334 */ 0xC4372F86,  8 }, { /* 335 */ 0xC3A13DE7,  8 },
    { /* 336 */ 0xC30C30C4,  8 }, { /* 337 */ 0xC2780614,  8 },
    { /* 338 */ 0xC1E4BBD6,  8 }, { /* 339 */ 0xC152500D,  8 },
    { /* 340 */ 0xC0C0C0C1,  8 }, { /* 341 */ 0xC0300C04,  8 },
    { /* 342 */ 0xBFA02FE9,  8 }, { /* 343 */ 0xBF112A8B,  8 },
    { /* 344 */ 0xBE82FA0C,  8 }, { /* 345 */ 0xBDF59C92,  8 },
    { /* 346 */ 0xBD691048,  8 }, { /* 347 */ 0xBCDD535E,  8 },
    { /* 348 */ 0xBC52640C,  8 }, { /* 349 */ 0xBBC8408D,  8 },
    { /* 350 */ 0xBB3EE722,  8 }, { /* 351 */ 0xBAB65611,  8 },
    { /* 352 */ 0xBA2E8BA3,  8 }, { /* 353 */ 0xB9A7862B,  8 },
    { /* 354 */ 0xB92143FB,  8 }, { /* 355 */ 0xB89BC36D,  8 },
    { /* 356 */ 0xB81702E1,  8 }, { /* 357 */ 0xB79300B8,  8 },
    { /* 358 */ 0xB70FBB5B,  8 }, { /* 359 */ 0xB68D3135,  8 },
    { /* 360 */ 0xB60B60B7,  8 }, { /* 361 */ 0xB58A4856,  8 },
    { /* 362 */ 0xB509E68B,  8 }, { /* 363 */ 0xB48A39D5,  8 },
    { /* 364 */ 0xB40B40B5,  8 }, { /* 365 */ 0xB38CF9B1,  8 },
    { /* 366 */ 0xB30F6353,  8 }, { /* 367 */ 0xB2927C2A,  8 },
    { /* 368 */ 0xB21642C9,  8 }, { /* 369 */ 0xB19AB5C5,  8 },
    { /* 370 */ 0xB11FD3B9,  8 }, { /* 371 */ 0xB0A59B42,  8 },
    { /* 372 */ 0xB02C0B03,  8 }, { /* 373 */ 0xAFB321A2,  8 },
    { /* 374 */ 0xAF3ADDC7,  8 }, { /* 375 */ 0xAEC33E20,  8 },
    { /* 376 */ 0xAE4C415D,  8 }, { /* 377 */ 0xADD5E633,  8 },
    { /* 378 */ 0xAD602B59,  8 }, { /* 379 */ 0xACEB0F8A,  8 },
    { /* 380 */ 0xAC769185,  8 }, { /* 381 */ 0xAC02B00B,  8 },
    { /* 382 */ 0xAB8F69E3,  8 }, { /* 383 */ 0xAB1CBDD4,  8 },
    { /* 384 */ 0xAAAAAAAB,  8 }, { /* 385 */ 0xAA392F36,  8 },
    { /* 386 */ 0xA9C84A48,  8 }, { /* 387 */ 0xA957FAB6,  8 },
    { /* 388 */ 0xA8E83F58,  8 }, { /* 389 */ 0xA8791709,  8 },
    { /* 390 */ 0xA80A80A9,  8 }, { /* 391 */ 0xA79C7B17,  8 },
    { /* 392 */ 0xA72F053A,  8 }, { /* 393 */ 0xA6C21DF7,  8 },
    { /* 394 */ 0xA655C43A,  8 }, { /* 395 */ 0xA5E9F6EE,  8 },
    { /* 396 */ 0xA57EB503,  8 }, { /* 397 */ 0xA513FD6C,  8 },
    { /* 398 */ 0xA4A9CF1E,  8 }, { /* 399 */ 0xA4402911,  8 },
    { /* 400 */ 0xA3D70A3E,  8 }, { /* 401 */ 0xA36E71A3,  8 },
    { /* 402 */ 0xA3065E40,  8 }, { /* 403 */ 0xA29ECF17,  8 },
    { /* 404 */ 0xA237C32C,  8 }, { /* 405 */ 0xA1D13986,  8 },
    { /* 406 */ 0xA16B312F,  8 }, { /* 407 */ 0xA105A933,  8 },
    { /* 408 */ 0xA0A0A0A1,  8 }, { /* 409 */ 0xA03C1689,  8 },
    { /* 410 */ 0x9FD809FE,  8 }, { /* 411 */ 0x9F747A16,  8 },
    { /* 412 */ 0x9F1165E8,  8 }, { /* 413 */ 0x9EAECC8E,  8 },
    { /* 414 */ 0x9E4CAD24,  8 }, { /* 415 */ 0x9DEB06CA,  8 },
    { /* 416 */ 0x9D89D89E,  8 }, { /* 417 */ 0x9D2921C4,  8 },
    { /* 418 */ 0x9CC8E161,  8 }, { /* 419 */ 0x9C69169C,  8 },
    { /* 420 */ 0x9C09C09D,  8 }, { /* 421 */ 0x9BAADE8F,  8 },
    { /* 422 */ 0x9B4C6F9F,  8 }, { /* 423 */ 0x9AEE72FD,  8 },
    { /* 424 */ 0x9A90E7DA,  8 }, { /* 425 */ 0x9A33CD68,  8 },
    { /* 426 */ 0x99D722DB,  8 }, { /* 427 */ 0x997AE76C,  8 },
    { /* 428 */ 0x991F1A52,  8 }, { /* 429 */ 0x98C3BAC8,  8 },
    { /* 430 */ 0x9868C80A,  8 }, { /* 431 */ 0x980E4157,  8 },
    { /* 432 */ 0x97B425EE,  8 }, { /* 433 */ 0x975A7510,  8 },
    { /* 434 */ 0x97012E03,  8 }, { /* 435 */ 0x96A8500A,  8 },
    { /* 436 */ 0x964FDA6D,  8 }, { /* 437 */ 0x95F7CC73,  8 },
    { /* 438 */ 0x95A02569,  8 }, { /* 439 */ 0x9548E498,  8 },
    { /* 440 */ 0x94F20950,  8 }, { /* 441 */ 0x949B92DE,  8 },
    { /* 442 */ 0x94458095,  8 }, { /* 443 */ 0x93EFD1C6,  8 },
    { /* 444 */ 0x939A85C5,  8 }, { /* 445 */ 0x93459BE7,  8 },
    { /* 446 */ 0x92F11385,  8 }, { /* 447 */ 0x929CEBF5,  8 },
    { /* 448 */ 0x92492493,  8 }, { /* 449 */ 0x91F5BCB9,  8 },
    { /* 450 */ 0x91A2B3C5,  8 }, { /* 451 */ 0x91500916,  8 },
    { /* 452 */ 0x90FDBC0A,  8 }, { /* 453 */ 0x90ABCC03,  8 },
    { /* 454 */ 0x905A3864,  8 }, { /* 455 */ 0x90090091,  8 },
    { /* 456 */ 0x8FB823EF,  8 }, { /* 457 */ 0x8F67A1E4,  8 },
    { /* 458 */ 0x8F1779DA,  8 }, { /* 459 */ 0x8EC7AB3A,  8 },
    { /* 460 */ 0x8E78356E,  8 }, { /* 461 */ 0x8E2917E1,  8 },
    { /* 462 */ 0x8DDA5203,  8 }, { /* 463 */ 0x8D8BE340,  8 },
    { /* 464 */ 0x8D3DCB09,  8 }, { /* 465 */ 0x8CF008D0,  8 },
    { /* 466 */ 0x8CA29C05,  8 }, { /* 467 */ 0x8C55841D,  8 },
    { /* 468 */ 0x8C08C08D,  8 }, { /* 469 */ 0x8BBC50C9,  8 },
    { /* 470 */ 0x8B70344B,  8 }, { /* 471 */ 0x8B246A88,  8 },
    { /* 472 */ 0x8AD8F2FC,  8 }, { /* 473 */ 0x8A8DCD20,  8 },
    { /* 474 */ 0x8A42F871,  8 }, { /* 475 */ 0x89F8746A,  8 },
    { /* 476 */ 0x89AE408A,  8 }, { /* 477 */ 0x89645C50,  8 },
    { /* 478 */ 0x891AC73B,  8 }, { /* 479 */ 0x88D180CE,  8 },
    { /* 480 */ 0x88888889,  8 }, { /* 481 */ 0x883FDDF1,  8 },
    { /* 482 */ 0x87F78088,  8 }, { /* 483 */ 0x87AF6FD6,  8 },
    { /* 484 */ 0x8767AB60,  8 }, { /* 485 */ 0x872032AD,  8 },
    { /* 486 */ 0x86D90545,  8 }, { /* 487 */ 0x869222B2,  8 },
    { /* 488 */ 0x864B8A7E,  8 }, { /* 489 */ 0x86053C35,  8 },
    { /* 490 */ 0x85BF3762,  8 }, { /* 491 */ 0x85797B92,  8 },
    { /* 492 */ 0x85340854,  8 }, { /* 493 */ 0x84EEDD36,  8 },
    { /* 494 */ 0x84A9F9C9,  8 }, { /* 495 */ 0x84655D9C,  8 },
    { /* 496 */ 0x84210843,  8 }, { /* 497 */ 0x83DCF94E,  8 },
    { /* 498 */ 0x83993053,  8 }, { /* 499 */ 0x8355ACE4,  8 },
    { /* 500 */ 0x83126E98,  8 }, { /* 501 */ 0x82CF7504,  8 },
    { /* 502 */ 0x828CBFBF,  8 }, { /* 503 */ 0x824A4E61,  8 },
    { /* 504 */ 0x82082083,  8 }, { /* 505 */ 0x81C635BD,  8 },
    { /* 506 */ 0x81848DA9,  8 }, { /* 507 */ 0x814327E4,  8 },
    { /* 508 */ 0x81020409,  8 }, { /* 509 */ 0x80C121B3,  8 },
    { /* 510 */ 0x80808081,  8 }, { /* 511 */ 0x80402011,  8 },
};

static const DivRatio32 div_ratio_tbl32_v2[kMaxDivTable] = {
    { /*   0 */ 0x00000000, 0x00000000,  0, 0 }, { /*   1 */ 0xFFFFFFFF, 0xFFFFFFFF,  0, 0 },
    { /*   2 */ 0x80000000, 0x00000000,  0, 0 }, { /*   3 */ 0xAAAAAAAB, 0x00000000,  1, 0 },
    { /*   4 */ 0x40000000, 0x00000000,  0, 0 }, { /*   5 */ 0xCCCCCCCD, 0x00000000,  2, 0 },
    { /*   6 */ 0xAAAAAAAB, 0x00000000,  2, 0 }, { /*   7 */ 0x92492492, 0x92492492,  2, 0 },
    { /*   8 */ 0x20000000, 0x00000000,  0, 0 }, { /*   9 */ 0xE38E38E4, 0x00000000,  3, 0 },
    { /*  10 */ 0xCCCCCCCD, 0x00000000,  3, 0 }, { /*  11 */ 0xBA2E8BA3, 0x00000000,  3, 0 },
    { /*  12 */ 0xAAAAAAAB, 0x00000000,  3, 0 }, { /*  13 */ 0x9D89D89E, 0x00000000,  3, 0 },
    { /*  14 */ 0x92492492, 0x92492492,  3, 0 }, { /*  15 */ 0x88888889, 0x00000000,  3, 0 },
    { /*  16 */ 0x10000000, 0x00000000,  0, 0 }, { /*  17 */ 0xF0F0F0F1, 0x00000000,  4, 0 },
    { /*  18 */ 0xE38E38E4, 0x00000000,  4, 0 }, { /*  19 */ 0xD79435E5, 0xD79435E5,  4, 0 },
    { /*  20 */ 0xCCCCCCCD, 0x00000000,  4, 0 }, { /*  21 */ 0xC30C30C3, 0xC30C30C3,  4, 0 },
    { /*  22 */ 0xBA2E8BA3, 0x00000000,  4, 0 }, { /*  23 */ 0xB21642C9, 0x00000000,  4, 0 },
    { /*  24 */ 0xAAAAAAAB, 0x00000000,  4, 0 }, { /*  25 */ 0xA3D70A3E, 0x00000000,  4, 0 },
    { /*  26 */ 0x9D89D89E, 0x00000000,  4, 0 }, { /*  27 */ 0x97B425ED, 0x97B425ED,  4, 0 },
    { /*  28 */ 0x92492492, 0x92492492,  4, 0 }, { /*  29 */ 0x8D3DCB09, 0x00000000,  4, 0 },
    { /*  30 */ 0x88888889, 0x00000000,  4, 0 }, { /*  31 */ 0x84210842, 0x84210842,  4, 0 },
    { /*  32 */ 0x08000000, 0x00000000,  0, 0 }, { /*  33 */ 0xF83E0F84, 0x00000000,  5, 0 },
    { /*  34 */ 0xF0F0F0F1, 0x00000000,  5, 0 }, { /*  35 */ 0xEA0EA0EA, 0xEA0EA0EA,  5, 0 },
    { /*  36 */ 0xE38E38E4, 0x00000000,  5, 0 }, { /*  37 */ 0xDD67C8A6, 0xDD67C8A6,  5, 0 },
    { /*  38 */ 0xD79435E5, 0xD79435E5,  5, 0 }, { /*  39 */ 0xD20D20D2, 0xD20D20D2,  5, 0 },
    { /*  40 */ 0xCCCCCCCD, 0x00000000,  5, 0 }, { /*  41 */ 0xC7CE0C7D, 0x00000000,  5, 0 },
    { /*  42 */ 0xC30C30C3, 0xC30C30C3,  5, 0 }, { /*  43 */ 0xBE82FA0C, 0x00000000,  5, 0 },
    { /*  44 */ 0xBA2E8BA3, 0x00000000,  5, 0 }, { /*  45 */ 0xB60B60B6, 0xB60B60B6,  5, 0 },
    { /*  46 */ 0xB21642C9, 0x00000000,  5, 0 }, { /*  47 */ 0xAE4C415D, 0x00000000,  5, 0 },
    { /*  48 */ 0xAAAAAAAB, 0x00000000,  5, 0 }, { /*  49 */ 0xA72F053A, 0x00000000,  5, 0 },
    { /*  50 */ 0xA3D70A3E, 0x00000000,  5, 0 }, { /*  51 */ 0xA0A0A0A1, 0x00000000,  5, 0 },
    { /*  52 */ 0x9D89D89E, 0x00000000,  5, 0 }, { /*  53 */ 0x9A90E7D9, 0x9A90E7D9,  5, 0 },
    { /*  54 */ 0x97B425ED, 0x97B425ED,  5, 0 }, { /*  55 */ 0x94F2094F, 0x94F2094F,  5, 0 },
    { /*  56 */ 0x92492492, 0x92492492,  5, 0 }, { /*  57 */ 0x8FB823EE, 0x8FB823EE,  5, 0 },
    { /*  58 */ 0x8D3DCB09, 0x00000000,  5, 0 }, { /*  59 */ 0x8AD8F2FC, 0x00000000,  5, 0 },
    { /*  60 */ 0x88888889, 0x00000000,  5, 0 }, { /*  61 */ 0x864B8A7E, 0x00000000,  5, 0 },
    { /*  62 */ 0x84210842, 0x84210842,  5, 0 }, { /*  63 */ 0x82082082, 0x82082082,  5, 0 },
    { /*  64 */ 0x04000000, 0x00000000,  0, 0 }, { /*  65 */ 0xFC0FC0FD, 0x00000000,  6, 0 },
    { /*  66 */ 0xF83E0F84, 0x00000000,  6, 0 }, { /*  67 */ 0xF4898D60, 0x00000000,  6, 0 },
    { /*  68 */ 0xF0F0F0F1, 0x00000000,  6, 0 }, { /*  69 */ 0xED7303B6, 0x00000000,  6, 0 },
    { /*  70 */ 0xEA0EA0EA, 0xEA0EA0EA,  6, 0 }, { /*  71 */ 0xE6C2B449, 0x00000000,  6, 0 },
    { /*  72 */ 0xE38E38E4, 0x00000000,  6, 0 }, { /*  73 */ 0xE070381C, 0xE070381C,  6, 0 },
    { /*  74 */ 0xDD67C8A6, 0xDD67C8A6,  6, 0 }, { /*  75 */ 0xDA740DA8, 0x00000000,  6, 0 },
    { /*  76 */ 0xD79435E5, 0xD79435E5,  6, 0 }, { /*  77 */ 0xD4C77B04, 0x00000000,  6, 0 },
    { /*  78 */ 0xD20D20D2, 0xD20D20D2,  6, 0 }, { /*  79 */ 0xCF6474A9, 0x00000000,  6, 0 },
    { /*  80 */ 0xCCCCCCCD, 0x00000000,  6, 0 }, { /*  81 */ 0xCA4587E7, 0x00000000,  6, 0 },
    { /*  82 */ 0xC7CE0C7D, 0x00000000,  6, 0 }, { /*  83 */ 0xC565C87C, 0x00000000,  6, 0 },
    { /*  84 */ 0xC30C30C3, 0xC30C30C3,  6, 0 }, { /*  85 */ 0xC0C0C0C1, 0x00000000,  6, 0 },
    { /*  86 */ 0xBE82FA0C, 0x00000000,  6, 0 }, { /*  87 */ 0xBC52640C, 0x00000000,  6, 0 },
    { /*  88 */ 0xBA2E8BA3, 0x00000000,  6, 0 }, { /*  89 */ 0xB81702E1, 0x00000000,  6, 0 },
    { /*  90 */ 0xB60B60B6, 0xB60B60B6,  6, 0 }, { /*  91 */ 0xB40B40B4, 0xB40B40B4,  6, 0 },
    { /*  92 */ 0xB21642C9, 0x00000000,  6, 0 }, { /*  93 */ 0xB02C0B03, 0x00000000,  6, 0 },
    { /*  94 */ 0xAE4C415D, 0x00000000,  6, 0 }, { /*  95 */ 0xAC769184, 0xAC769184,  6, 0 },
    { /*  96 */ 0xAAAAAAAB, 0x00000000,  6, 0 }, { /*  97 */ 0xA8E83F57, 0xA8E83F57,  6, 0 },
    { /*  98 */ 0xA72F053A, 0x00000000,  6, 0 }, { /*  99 */ 0xA57EB503, 0x00000000,  6, 0 },
    { /* 100 */ 0xA3D70A3E, 0x00000000,  6, 0 }, { /* 101 */ 0xA237C32B, 0xA237C32B,  6, 0 },
    { /* 102 */ 0xA0A0A0A1, 0x00000000,  6, 0 }, { /* 103 */ 0x9F1165E7, 0x9F1165E7,  6, 0 },
    { /* 104 */ 0x9D89D89E, 0x00000000,  6, 0 }, { /* 105 */ 0x9C09C09C, 0x9C09C09C,  6, 0 },
    { /* 106 */ 0x9A90E7D9, 0x9A90E7D9,  6, 0 }, { /* 107 */ 0x991F1A51, 0x991F1A51,  6, 0 },
    { /* 108 */ 0x97B425ED, 0x97B425ED,  6, 0 }, { /* 109 */ 0x964FDA6C, 0x964FDA6C,  6, 0 },
    { /* 110 */ 0x94F2094F, 0x94F2094F,  6, 0 }, { /* 111 */ 0x939A85C4, 0x939A85C4,  6, 0 },
    { /* 112 */ 0x92492492, 0x92492492,  6, 0 }, { /* 113 */ 0x90FDBC09, 0x90FDBC09,  6, 0 },
    { /* 114 */ 0x8FB823EE, 0x8FB823EE,  6, 0 }, { /* 115 */ 0x8E78356D, 0x8E78356D,  6, 0 },
    { /* 116 */ 0x8D3DCB09, 0x00000000,  6, 0 }, { /* 117 */ 0x8C08C08C, 0x8C08C08C,  6, 0 },
    { /* 118 */ 0x8AD8F2FC, 0x00000000,  6, 0 }, { /* 119 */ 0x89AE408A, 0x00000000,  6, 0 },
    { /* 120 */ 0x88888889, 0x00000000,  6, 0 }, { /* 121 */ 0x8767AB5F, 0x8767AB5F,  6, 0 },
    { /* 122 */ 0x864B8A7E, 0x00000000,  6, 0 }, { /* 123 */ 0x85340853, 0x85340853,  6, 0 },
    { /* 124 */ 0x84210842, 0x84210842,  6, 0 }, { /* 125 */ 0x83126E98, 0x00000000,  6, 0 },
    { /* 126 */ 0x82082082, 0x82082082,  6, 0 }, { /* 127 */ 0x81020408, 0x81020408,  6, 0 },
    { /* 128 */ 0x02000000, 0x00000000,  0, 0 }, { /* 129 */ 0xFE03F810, 0x00000000,  7, 0 },
    { /* 130 */ 0xFC0FC0FD, 0x00000000,  7, 0 }, { /* 131 */ 0xFA232CF3, 0x00000000,  7, 0 },
    { /* 132 */ 0xF83E0F84, 0x00000000,  7, 0 }, { /* 133 */ 0xF6603D99, 0x00000000,  7, 0 },
    { /* 134 */ 0xF4898D60, 0x00000000,  7, 0 }, { /* 135 */ 0xF2B9D649, 0x00000000,  7, 0 },
    { /* 136 */ 0xF0F0F0F1, 0x00000000,  7, 0 }, { /* 137 */ 0xEF2EB720, 0x00000000,  7, 0 },
    { /* 138 */ 0xED7303B6, 0x00000000,  7, 0 }, { /* 139 */ 0xEBBDB2A6, 0x00000000,  7, 0 },
    { /* 140 */ 0xEA0EA0EA, 0xEA0EA0EA,  7, 0 }, { /* 141 */ 0xE865AC7C, 0x00000000,  7, 0 },
    { /* 142 */ 0xE6C2B449, 0x00000000,  7, 0 }, { /* 143 */ 0xE525982B, 0x00000000,  7, 0 },
    { /* 144 */ 0xE38E38E4, 0x00000000,  7, 0 }, { /* 145 */ 0xE1FC780F, 0x00000000,  7, 0 },
    { /* 146 */ 0xE070381C, 0xE070381C,  7, 0 }, { /* 147 */ 0xDEE95C4D, 0x00000000,  7, 0 },
    { /* 148 */ 0xDD67C8A6, 0xDD67C8A6,  7, 0 }, { /* 149 */ 0xDBEB61EF, 0x00000000,  7, 0 },
    { /* 150 */ 0xDA740DA8, 0x00000000,  7, 0 }, { /* 151 */ 0xD901B204, 0x00000000,  7, 0 },
    { /* 152 */ 0xD79435E5, 0xD79435E5,  7, 0 }, { /* 153 */ 0xD62B80D7, 0x00000000,  7, 0 },
    { /* 154 */ 0xD4C77B04, 0x00000000,  7, 0 }, { /* 155 */ 0xD3680D37, 0x00000000,  7, 0 },
    { /* 156 */ 0xD20D20D2, 0xD20D20D2,  7, 0 }, { /* 157 */ 0xD0B69FCC, 0x00000000,  7, 0 },
    { /* 158 */ 0xCF6474A9, 0x00000000,  7, 0 }, { /* 159 */ 0xCE168A77, 0xCE168A77,  7, 0 },
    { /* 160 */ 0xCCCCCCCD, 0x00000000,  7, 0 }, { /* 161 */ 0xCB8727C1, 0x00000000,  7, 0 },
    { /* 162 */ 0xCA4587E7, 0x00000000,  7, 0 }, { /* 163 */ 0xC907DA4F, 0x00000000,  7, 0 },
    { /* 164 */ 0xC7CE0C7D, 0x00000000,  7, 0 }, { /* 165 */ 0xC6980C6A, 0x00000000,  7, 0 },
    { /* 166 */ 0xC565C87C, 0x00000000,  7, 0 }, { /* 167 */ 0xC4372F86, 0x00000000,  7, 0 },
    { /* 168 */ 0xC30C30C3, 0xC30C30C3,  7, 0 }, { /* 169 */ 0xC1E4BBD6, 0x00000000,  7, 0 },
    { /* 170 */ 0xC0C0C0C1, 0x00000000,  7, 0 }, { /* 171 */ 0xBFA02FE8, 0xBFA02FE8,  7, 0 },
    { /* 172 */ 0xBE82FA0C, 0x00000000,  7, 0 }, { /* 173 */ 0xBD691047, 0xBD691047,  7, 0 },
    { /* 174 */ 0xBC52640C, 0x00000000,  7, 0 }, { /* 175 */ 0xBB3EE722, 0x00000000,  7, 0 },
    { /* 176 */ 0xBA2E8BA3, 0x00000000,  7, 0 }, { /* 177 */ 0xB92143FA, 0xB92143FA,  7, 0 },
    { /* 178 */ 0xB81702E1, 0x00000000,  7, 0 }, { /* 179 */ 0xB70FBB5A, 0xB70FBB5A,  7, 0 },
    { /* 180 */ 0xB60B60B6, 0xB60B60B6,  7, 0 }, { /* 181 */ 0xB509E68B, 0x00000000,  7, 0 },
    { /* 182 */ 0xB40B40B4, 0xB40B40B4,  7, 0 }, { /* 183 */ 0xB30F6353, 0x00000000,  7, 0 },
    { /* 184 */ 0xB21642C9, 0x00000000,  7, 0 }, { /* 185 */ 0xB11FD3B8, 0xB11FD3B8,  7, 0 },
    { /* 186 */ 0xB02C0B03, 0x00000000,  7, 0 }, { /* 187 */ 0xAF3ADDC7, 0x00000000,  7, 0 },
    { /* 188 */ 0xAE4C415D, 0x00000000,  7, 0 }, { /* 189 */ 0xAD602B58, 0xAD602B58,  7, 0 },
    { /* 190 */ 0xAC769184, 0xAC769184,  7, 0 }, { /* 191 */ 0xAB8F69E3, 0x00000000,  7, 0 },
    { /* 192 */ 0xAAAAAAAB, 0x00000000,  7, 0 }, { /* 193 */ 0xA9C84A48, 0x00000000,  7, 0 },
    { /* 194 */ 0xA8E83F57, 0xA8E83F57,  7, 0 }, { /* 195 */ 0xA80A80A8, 0xA80A80A8,  7, 0 },
    { /* 196 */ 0xA72F053A, 0x00000000,  7, 0 }, { /* 197 */ 0xA655C439, 0xA655C439,  7, 0 },
    { /* 198 */ 0xA57EB503, 0x00000000,  7, 0 }, { /* 199 */ 0xA4A9CF1E, 0x00000000,  7, 0 },
    { /* 200 */ 0xA3D70A3E, 0x00000000,  7, 0 }, { /* 201 */ 0xA3065E40, 0x00000000,  7, 0 },
    { /* 202 */ 0xA237C32B, 0xA237C32B,  7, 0 }, { /* 203 */ 0xA16B312F, 0x00000000,  7, 0 },
    { /* 204 */ 0xA0A0A0A1, 0x00000000,  7, 0 }, { /* 205 */ 0x9FD809FE, 0x00000000,  7, 0 },
    { /* 206 */ 0x9F1165E7, 0x9F1165E7,  7, 0 }, { /* 207 */ 0x9E4CAD24, 0x00000000,  7, 0 },
    { /* 208 */ 0x9D89D89E, 0x00000000,  7, 0 }, { /* 209 */ 0x9CC8E161, 0x00000000,  7, 0 },
    { /* 210 */ 0x9C09C09C, 0x9C09C09C,  7, 0 }, { /* 211 */ 0x9B4C6F9F, 0x00000000,  7, 0 },
    { /* 212 */ 0x9A90E7D9, 0x9A90E7D9,  7, 0 }, { /* 213 */ 0x99D722DB, 0x00000000,  7, 0 },
    { /* 214 */ 0x991F1A51, 0x991F1A51,  7, 0 }, { /* 215 */ 0x9868C80A, 0x00000000,  7, 0 },
    { /* 216 */ 0x97B425ED, 0x97B425ED,  7, 0 }, { /* 217 */ 0x97012E02, 0x97012E02,  7, 0 },
    { /* 218 */ 0x964FDA6C, 0x964FDA6C,  7, 0 }, { /* 219 */ 0x95A02568, 0x95A02568,  7, 0 },
    { /* 220 */ 0x94F2094F, 0x94F2094F,  7, 0 }, { /* 221 */ 0x94458094, 0x94458094,  7, 0 },
    { /* 222 */ 0x939A85C4, 0x939A85C4,  7, 0 }, { /* 223 */ 0x92F11384, 0x92F11384,  7, 0 },
    { /* 224 */ 0x92492492, 0x92492492,  7, 0 }, { /* 225 */ 0x91A2B3C5, 0x00000000,  7, 0 },
    { /* 226 */ 0x90FDBC09, 0x90FDBC09,  7, 0 }, { /* 227 */ 0x905A3863, 0x905A3863,  7, 0 },
    { /* 228 */ 0x8FB823EE, 0x8FB823EE,  7, 0 }, { /* 229 */ 0x8F1779DA, 0x00000000,  7, 0 },
    { /* 230 */ 0x8E78356D, 0x8E78356D,  7, 0 }, { /* 231 */ 0x8DDA5202, 0x8DDA5202,  7, 0 },
    { /* 232 */ 0x8D3DCB09, 0x00000000,  7, 0 }, { /* 233 */ 0x8CA29C04, 0x8CA29C04,  7, 0 },
    { /* 234 */ 0x8C08C08C, 0x8C08C08C,  7, 0 }, { /* 235 */ 0x8B70344A, 0x8B70344A,  7, 0 },
    { /* 236 */ 0x8AD8F2FC, 0x00000000,  7, 0 }, { /* 237 */ 0x8A42F870, 0x8A42F870,  7, 0 },
    { /* 238 */ 0x89AE408A, 0x00000000,  7, 0 }, { /* 239 */ 0x891AC73B, 0x00000000,  7, 0 },
    { /* 240 */ 0x88888889, 0x00000000,  7, 0 }, { /* 241 */ 0x87F78088, 0x00000000,  7, 0 },
    { /* 242 */ 0x8767AB5F, 0x8767AB5F,  7, 0 }, { /* 243 */ 0x86D90545, 0x00000000,  7, 0 },
    { /* 244 */ 0x864B8A7E, 0x00000000,  7, 0 }, { /* 245 */ 0x85BF3761, 0x85BF3761,  7, 0 },
    { /* 246 */ 0x85340853, 0x85340853,  7, 0 }, { /* 247 */ 0x84A9F9C8, 0x84A9F9C8,  7, 0 },
    { /* 248 */ 0x84210842, 0x84210842,  7, 0 }, { /* 249 */ 0x83993052, 0x83993052,  7, 0 },
    { /* 250 */ 0x83126E98, 0x00000000,  7, 0 }, { /* 251 */ 0x828CBFBF, 0x00000000,  7, 0 },
    { /* 252 */ 0x82082082, 0x82082082,  7, 0 }, { /* 253 */ 0x81848DA9, 0x00000000,  7, 0 },
    { /* 254 */ 0x81020408, 0x81020408,  7, 0 }, { /* 255 */ 0x80808081, 0x00000000,  7, 0 },
    { /* 256 */ 0x01000000, 0x00000000,  0, 0 }, { /* 257 */ 0xFF00FF01, 0x00000000,  8, 0 },
    { /* 258 */ 0xFE03F810, 0x00000000,  8, 0 }, { /* 259 */ 0xFD08E551, 0x00000000,  8, 0 },
    { /* 260 */ 0xFC0FC0FD, 0x00000000,  8, 0 }, { /* 261 */ 0xFB188566, 0x00000000,  8, 0 },
    { /* 262 */ 0xFA232CF3, 0x00000000,  8, 0 }, { /* 263 */ 0xF92FB222, 0x00000000,  8, 0 },
    { /* 264 */ 0xF83E0F84, 0x00000000,  8, 0 }, { /* 265 */ 0xF74E3FC3, 0x00000000,  8, 0 },
    { /* 266 */ 0xF6603D99, 0x00000000,  8, 0 }, { /* 267 */ 0xF57403D6, 0x00000000,  8, 0 },
    { /* 268 */ 0xF4898D60, 0x00000000,  8, 0 }, { /* 269 */ 0xF3A0D52D, 0x00000000,  8, 0 },
    { /* 270 */ 0xF2B9D649, 0x00000000,  8, 0 }, { /* 271 */ 0xF1D48BCF, 0x00000000,  8, 0 },
    { /* 272 */ 0xF0F0F0F1, 0x00000000,  8, 0 }, { /* 273 */ 0xF00F00F0, 0xF00F00F0,  8, 0 },
    { /* 274 */ 0xEF2EB720, 0x00000000,  8, 0 }, { /* 275 */ 0xEE500EE5, 0xEE500EE5,  8, 0 },
    { /* 276 */ 0xED7303B6, 0x00000000,  8, 0 }, { /* 277 */ 0xEC979119, 0x00000000,  8, 0 },
    { /* 278 */ 0xEBBDB2A6, 0x00000000,  8, 0 }, { /* 279 */ 0xEAE56404, 0x00000000,  8, 0 },
    { /* 280 */ 0xEA0EA0EA, 0xEA0EA0EA,  8, 0 }, { /* 281 */ 0xE9396520, 0x00000000,  8, 0 },
    { /* 282 */ 0xE865AC7C, 0x00000000,  8, 0 }, { /* 283 */ 0xE79372E3, 0x00000000,  8, 0 },
    { /* 284 */ 0xE6C2B449, 0x00000000,  8, 0 }, { /* 285 */ 0xE5F36CB0, 0xE5F36CB0,  8, 0 },
    { /* 286 */ 0xE525982B, 0x00000000,  8, 0 }, { /* 287 */ 0xE45932D8, 0x00000000,  8, 0 },
    { /* 288 */ 0xE38E38E4, 0x00000000,  8, 0 }, { /* 289 */ 0xE2C4A689, 0x00000000,  8, 0 },
    { /* 290 */ 0xE1FC780F, 0x00000000,  8, 0 }, { /* 291 */ 0xE135A9CA, 0x00000000,  8, 0 },
    { /* 292 */ 0xE070381C, 0xE070381C,  8, 0 }, { /* 293 */ 0xDFAC1F75, 0x00000000,  8, 0 },
    { /* 294 */ 0xDEE95C4D, 0x00000000,  8, 0 }, { /* 295 */ 0xDE27EB2D, 0x00000000,  8, 0 },
    { /* 296 */ 0xDD67C8A6, 0xDD67C8A6,  8, 0 }, { /* 297 */ 0xDCA8F159, 0x00000000,  8, 0 },
    { /* 298 */ 0xDBEB61EF, 0x00000000,  8, 0 }, { /* 299 */ 0xDB2F171E, 0x00000000,  8, 0 },
    { /* 300 */ 0xDA740DA8, 0x00000000,  8, 0 }, { /* 301 */ 0xD9BA4257, 0x00000000,  8, 0 },
    { /* 302 */ 0xD901B204, 0x00000000,  8, 0 }, { /* 303 */ 0xD84A598F, 0x00000000,  8, 0 },
    { /* 304 */ 0xD79435E5, 0xD79435E5,  8, 0 }, { /* 305 */ 0xD6DF43FD, 0x00000000,  8, 0 },
    { /* 306 */ 0xD62B80D7, 0x00000000,  8, 0 }, { /* 307 */ 0xD578E97D, 0x00000000,  8, 0 },
    { /* 308 */ 0xD4C77B04, 0x00000000,  8, 0 }, { /* 309 */ 0xD417328A, 0x00000000,  8, 0 },
    { /* 310 */ 0xD3680D37, 0x00000000,  8, 0 }, { /* 311 */ 0xD2BA083C, 0x00000000,  8, 0 },
    { /* 312 */ 0xD20D20D2, 0xD20D20D2,  8, 0 }, { /* 313 */ 0xD161543E, 0xD161543E,  8, 0 },
    { /* 314 */ 0xD0B69FCC, 0x00000000,  8, 0 }, { /* 315 */ 0xD00D00D0, 0xD00D00D0,  8, 0 },
    { /* 316 */ 0xCF6474A9, 0x00000000,  8, 0 }, { /* 317 */ 0xCEBCF8BC, 0x00000000,  8, 0 },
    { /* 318 */ 0xCE168A77, 0xCE168A77,  8, 0 }, { /* 319 */ 0xCD712753, 0x00000000,  8, 0 },
    { /* 320 */ 0xCCCCCCCD, 0x00000000,  8, 0 }, { /* 321 */ 0xCC29786D, 0x00000000,  8, 0 },
    { /* 322 */ 0xCB8727C1, 0x00000000,  8, 0 }, { /* 323 */ 0xCAE5D85F, 0xCAE5D85F,  8, 0 },
    { /* 324 */ 0xCA4587E7, 0x00000000,  8, 0 }, { /* 325 */ 0xC9A633FD, 0x00000000,  8, 0 },
    { /* 326 */ 0xC907DA4F, 0x00000000,  8, 0 }, { /* 327 */ 0xC86A7890, 0xC86A7890,  8, 0 },
    { /* 328 */ 0xC7CE0C7D, 0x00000000,  8, 0 }, { /* 329 */ 0xC73293D8, 0x00000000,  8, 0 },
    { /* 330 */ 0xC6980C6A, 0x00000000,  8, 0 }, { /* 331 */ 0xC5FE7403, 0xC5FE7403,  8, 0 },
    { /* 332 */ 0xC565C87C, 0x00000000,  8, 0 }, { /* 333 */ 0xC4CE07B0, 0xC4CE07B0,  8, 0 },
    { /* 334 */ 0xC4372F86, 0x00000000,  8, 0 }, { /* 335 */ 0xC3A13DE6, 0xC3A13DE6,  8, 0 },
    { /* 336 */ 0xC30C30C3, 0xC30C30C3,  8, 0 }, { /* 337 */ 0xC2780614, 0x00000000,  8, 0 },
    { /* 338 */ 0xC1E4BBD6, 0x00000000,  8, 0 }, { /* 339 */ 0xC152500C, 0xC152500C,  8, 0 },
    { /* 340 */ 0xC0C0C0C1, 0x00000000,  8, 0 }, { /* 341 */ 0xC0300C03, 0xC0300C03,  8, 0 },
    { /* 342 */ 0xBFA02FE8, 0xBFA02FE8,  8, 0 }, { /* 343 */ 0xBF112A8B, 0x00000000,  8, 0 },
    { /* 344 */ 0xBE82FA0C, 0x00000000,  8, 0 }, { /* 345 */ 0xBDF59C92, 0x00000000,  8, 0 },
    { /* 346 */ 0xBD691047, 0xBD691047,  8, 0 }, { /* 347 */ 0xBCDD535E, 0x00000000,  8, 0 },
    { /* 348 */ 0xBC52640C, 0x00000000,  8, 0 }, { /* 349 */ 0xBBC8408D, 0x00000000,  8, 0 },
    { /* 350 */ 0xBB3EE722, 0x00000000,  8, 0 }, { /* 351 */ 0xBAB65610, 0xBAB65610,  8, 0 },
    { /* 352 */ 0xBA2E8BA3, 0x00000000,  8, 0 }, { /* 353 */ 0xB9A7862A, 0xB9A7862A,  8, 0 },
    { /* 354 */ 0xB92143FA, 0xB92143FA,  8, 0 }, { /* 355 */ 0xB89BC36D, 0x00000000,  8, 0 },
    { /* 356 */ 0xB81702E1, 0x00000000,  8, 0 }, { /* 357 */ 0xB79300B8, 0x00000000,  8, 0 },
    { /* 358 */ 0xB70FBB5A, 0xB70FBB5A,  8, 0 }, { /* 359 */ 0xB68D3134, 0xB68D3134,  8, 0 },
    { /* 360 */ 0xB60B60B6, 0xB60B60B6,  8, 0 }, { /* 361 */ 0xB58A4855, 0xB58A4855,  8, 0 },
    { /* 362 */ 0xB509E68B, 0x00000000,  8, 0 }, { /* 363 */ 0xB48A39D4, 0xB48A39D4,  8, 0 },
    { /* 364 */ 0xB40B40B4, 0xB40B40B4,  8, 0 }, { /* 365 */ 0xB38CF9B0, 0xB38CF9B0,  8, 0 },
    { /* 366 */ 0xB30F6353, 0x00000000,  8, 0 }, { /* 367 */ 0xB2927C2A, 0x00000000,  8, 0 },
    { /* 368 */ 0xB21642C9, 0x00000000,  8, 0 }, { /* 369 */ 0xB19AB5C5, 0x00000000,  8, 0 },
    { /* 370 */ 0xB11FD3B8, 0xB11FD3B8,  8, 0 }, { /* 371 */ 0xB0A59B42, 0x00000000,  8, 0 },
    { /* 372 */ 0xB02C0B03, 0x00000000,  8, 0 }, { /* 373 */ 0xAFB321A1, 0xAFB321A1,  8, 0 },
    { /* 374 */ 0xAF3ADDC7, 0x00000000,  8, 0 }, { /* 375 */ 0xAEC33E20, 0x00000000,  8, 0 },
    { /* 376 */ 0xAE4C415D, 0x00000000,  8, 0 }, { /* 377 */ 0xADD5E632, 0xADD5E632,  8, 0 },
    { /* 378 */ 0xAD602B58, 0xAD602B58,  8, 0 }, { /* 379 */ 0xACEB0F89, 0xACEB0F89,  8, 0 },
    { /* 380 */ 0xAC769184, 0xAC769184,  8, 0 }, { /* 381 */ 0xAC02B00B, 0x00000000,  8, 0 },
    { /* 382 */ 0xAB8F69E3, 0x00000000,  8, 0 }, { /* 383 */ 0xAB1CBDD4, 0x00000000,  8, 0 },
    { /* 384 */ 0xAAAAAAAB, 0x00000000,  8, 0 }, { /* 385 */ 0xAA392F36, 0x00000000,  8, 0 },
    { /* 386 */ 0xA9C84A48, 0x00000000,  8, 0 }, { /* 387 */ 0xA957FAB5, 0xA957FAB5,  8, 0 },
    { /* 388 */ 0xA8E83F57, 0xA8E83F57,  8, 0 }, { /* 389 */ 0xA8791709, 0x00000000,  8, 0 },
    { /* 390 */ 0xA80A80A8, 0xA80A80A8,  8, 0 }, { /* 391 */ 0xA79C7B17, 0x00000000,  8, 0 },
    { /* 392 */ 0xA72F053A, 0x00000000,  8, 0 }, { /* 393 */ 0xA6C21DF7, 0x00000000,  8, 0 },
    { /* 394 */ 0xA655C439, 0xA655C439,  8, 0 }, { /* 395 */ 0xA5E9F6ED, 0xA5E9F6ED,  8, 0 },
    { /* 396 */ 0xA57EB503, 0x00000000,  8, 0 }, { /* 397 */ 0xA513FD6C, 0x00000000,  8, 0 },
    { /* 398 */ 0xA4A9CF1E, 0x00000000,  8, 0 }, { /* 399 */ 0xA4402910, 0xA4402910,  8, 0 },
    { /* 400 */ 0xA3D70A3E, 0x00000000,  8, 0 }, { /* 401 */ 0xA36E71A3, 0x00000000,  8, 0 },
    { /* 402 */ 0xA3065E40, 0x00000000,  8, 0 }, { /* 403 */ 0xA29ECF16, 0xA29ECF16,  8, 0 },
    { /* 404 */ 0xA237C32B, 0xA237C32B,  8, 0 }, { /* 405 */ 0xA1D13986, 0x00000000,  8, 0 },
    { /* 406 */ 0xA16B312F, 0x00000000,  8, 0 }, { /* 407 */ 0xA105A933, 0x00000000,  8, 0 },
    { /* 408 */ 0xA0A0A0A1, 0x00000000,  8, 0 }, { /* 409 */ 0xA03C1689, 0x00000000,  8, 0 },
    { /* 410 */ 0x9FD809FE, 0x00000000,  8, 0 }, { /* 411 */ 0x9F747A15, 0x9F747A15,  8, 0 },
    { /* 412 */ 0x9F1165E7, 0x9F1165E7,  8, 0 }, { /* 413 */ 0x9EAECC8D, 0x9EAECC8D,  8, 0 },
    { /* 414 */ 0x9E4CAD24, 0x00000000,  8, 0 }, { /* 415 */ 0x9DEB06C9, 0x9DEB06C9,  8, 0 },
    { /* 416 */ 0x9D89D89E, 0x00000000,  8, 0 }, { /* 417 */ 0x9D2921C4, 0x00000000,  8, 0 },
    { /* 418 */ 0x9CC8E161, 0x00000000,  8, 0 }, { /* 419 */ 0x9C69169B, 0x9C69169B,  8, 0 },
    { /* 420 */ 0x9C09C09C, 0x9C09C09C,  8, 0 }, { /* 421 */ 0x9BAADE8E, 0x9BAADE8E,  8, 0 },
    { /* 422 */ 0x9B4C6F9F, 0x00000000,  8, 0 }, { /* 423 */ 0x9AEE72FD, 0x00000000,  8, 0 },
    { /* 424 */ 0x9A90E7D9, 0x9A90E7D9,  8, 0 }, { /* 425 */ 0x9A33CD67, 0x9A33CD67,  8, 0 },
    { /* 426 */ 0x99D722DB, 0x00000000,  8, 0 }, { /* 427 */ 0x997AE76B, 0x997AE76B,  8, 0 },
    { /* 428 */ 0x991F1A51, 0x991F1A51,  8, 0 }, { /* 429 */ 0x98C3BAC7, 0x98C3BAC7,  8, 0 },
    { /* 430 */ 0x9868C80A, 0x00000000,  8, 0 }, { /* 431 */ 0x980E4156, 0x980E4156,  8, 0 },
    { /* 432 */ 0x97B425ED, 0x97B425ED,  8, 0 }, { /* 433 */ 0x975A7510, 0x00000000,  8, 0 },
    { /* 434 */ 0x97012E02, 0x97012E02,  8, 0 }, { /* 435 */ 0x96A8500A, 0x00000000,  8, 0 },
    { /* 436 */ 0x964FDA6C, 0x964FDA6C,  8, 0 }, { /* 437 */ 0x95F7CC73, 0x00000000,  8, 0 },
    { /* 438 */ 0x95A02568, 0x95A02568,  8, 0 }, { /* 439 */ 0x9548E498, 0x00000000,  8, 0 },
    { /* 440 */ 0x94F2094F, 0x94F2094F,  8, 0 }, { /* 441 */ 0x949B92DE, 0x00000000,  8, 0 },
    { /* 442 */ 0x94458094, 0x94458094,  8, 0 }, { /* 443 */ 0x93EFD1C5, 0x93EFD1C5,  8, 0 },
    { /* 444 */ 0x939A85C4, 0x939A85C4,  8, 0 }, { /* 445 */ 0x93459BE7, 0x00000000,  8, 0 },
    { /* 446 */ 0x92F11384, 0x92F11384,  8, 0 }, { /* 447 */ 0x929CEBF5, 0x00000000,  8, 0 },
    { /* 448 */ 0x92492492, 0x92492492,  8, 0 }, { /* 449 */ 0x91F5BCB9, 0x00000000,  8, 0 },
    { /* 450 */ 0x91A2B3C5, 0x00000000,  8, 0 }, { /* 451 */ 0x91500915, 0x91500915,  8, 0 },
    { /* 452 */ 0x90FDBC09, 0x90FDBC09,  8, 0 }, { /* 453 */ 0x90ABCC02, 0x90ABCC02,  8, 0 },
    { /* 454 */ 0x905A3863, 0x905A3863,  8, 0 }, { /* 455 */ 0x90090090, 0x90090090,  8, 0 },
    { /* 456 */ 0x8FB823EE, 0x8FB823EE,  8, 0 }, { /* 457 */ 0x8F67A1E4, 0x00000000,  8, 0 },
    { /* 458 */ 0x8F1779DA, 0x00000000,  8, 0 }, { /* 459 */ 0x8EC7AB3A, 0x00000000,  8, 0 },
    { /* 460 */ 0x8E78356D, 0x8E78356D,  8, 0 }, { /* 461 */ 0x8E2917E1, 0x00000000,  8, 0 },
    { /* 462 */ 0x8DDA5202, 0x8DDA5202,  8, 0 }, { /* 463 */ 0x8D8BE340, 0x00000000,  8, 0 },
    { /* 464 */ 0x8D3DCB09, 0x00000000,  8, 0 }, { /* 465 */ 0x8CF008CF, 0x8CF008CF,  8, 0 },
    { /* 466 */ 0x8CA29C04, 0x8CA29C04,  8, 0 }, { /* 467 */ 0x8C55841D, 0x00000000,  8, 0 },
    { /* 468 */ 0x8C08C08C, 0x8C08C08C,  8, 0 }, { /* 469 */ 0x8BBC50C9, 0x00000000,  8, 0 },
    { /* 470 */ 0x8B70344A, 0x8B70344A,  8, 0 }, { /* 471 */ 0x8B246A88, 0x00000000,  8, 0 },
    { /* 472 */ 0x8AD8F2FC, 0x00000000,  8, 0 }, { /* 473 */ 0x8A8DCD20, 0x00000000,  8, 0 },
    { /* 474 */ 0x8A42F870, 0x8A42F870,  8, 0 }, { /* 475 */ 0x89F8746A, 0x00000000,  8, 0 },
    { /* 476 */ 0x89AE408A, 0x00000000,  8, 0 }, { /* 477 */ 0x89645C4F, 0x89645C4F,  8, 0 },
    { /* 478 */ 0x891AC73B, 0x00000000,  8, 0 }, { /* 479 */ 0x88D180CD, 0x88D180CD,  8, 0 },
    { /* 480 */ 0x88888889, 0x00000000,  8, 0 }, { /* 481 */ 0x883FDDF0, 0x883FDDF0,  8, 0 },
    { /* 482 */ 0x87F78088, 0x00000000,  8, 0 }, { /* 483 */ 0x87AF6FD6, 0x00000000,  8, 0 },
    { /* 484 */ 0x8767AB5F, 0x8767AB5F,  8, 0 }, { /* 485 */ 0x872032AC, 0x872032AC,  8, 0 },
    { /* 486 */ 0x86D90545, 0x00000000,  8, 0 }, { /* 487 */ 0x869222B2, 0x00000000,  8, 0 },
    { /* 488 */ 0x864B8A7E, 0x00000000,  8, 0 }, { /* 489 */ 0x86053C34, 0x86053C34,  8, 0 },
    { /* 490 */ 0x85BF3761, 0x85BF3761,  8, 0 }, { /* 491 */ 0x85797B91, 0x85797B91,  8, 0 },
    { /* 492 */ 0x85340853, 0x85340853,  8, 0 }, { /* 493 */ 0x84EEDD36, 0x00000000,  8, 0 },
    { /* 494 */ 0x84A9F9C8, 0x84A9F9C8,  8, 0 }, { /* 495 */ 0x84655D9C, 0x00000000,  8, 0 },
    { /* 496 */ 0x84210842, 0x84210842,  8, 0 }, { /* 497 */ 0x83DCF94E, 0x00000000,  8, 0 },
    { /* 498 */ 0x83993052, 0x83993052,  8, 0 }, { /* 499 */ 0x8355ACE4, 0x00000000,  8, 0 },
    { /* 500 */ 0x83126E98, 0x00000000,  8, 0 }, { /* 501 */ 0x82CF7504, 0x00000000,  8, 0 },
    { /* 502 */ 0x828CBFBF, 0x00000000,  8, 0 }, { /* 503 */ 0x824A4E61, 0x00000000,  8, 0 },
    { /* 504 */ 0x82082082, 0x82082082,  8, 0 }, { /* 505 */ 0x81C635BC, 0x81C635BC,  8, 0 },
    { /* 506 */ 0x81848DA9, 0x00000000,  8, 0 }, { /* 507 */ 0x814327E4, 0x00000000,  8, 0 },
    { /* 508 */ 0x81020408, 0x81020408,  8, 0 }, { /* 509 */ 0x80C121B3, 0x00000000,  8, 0 },
    { /* 510 */ 0x80808081, 0x00000000,  8, 0 }, { /* 511 */ 0x80402010, 0x80402010,  8, 0 },
};

static const DivRatio32 div_ratio_tbl32[kMaxDivTable] = {
    { /*   0 */ 0x00000000, 0x00000000,  0, 0 }, { /*   1 */ 0xFFFFFFFF, 0xFFFFFFFF,  0, 0 },
    { /*   2 */ 0x80000000, 0x00000000,  0, 0 }, { /*   3 */ 0xAAAAAAAB, 0x00000000,  1, 0 },
    { /*   4 */ 0x40000000, 0x00000000,  0, 0 }, { /*   5 */ 0xCCCCCCCD, 0x00000000,  2, 0 },
    { /*   6 */ 0xAAAAAAAB, 0x00000000,  2, 0 }, { /*   7 */ 0x92492492, 0x6938A22A,  2, 0 },
    { /*   8 */ 0x20000000, 0x00000000,  0, 0 }, { /*   9 */ 0xE38E38E4, 0x00000000,  3, 0 },
    { /*  10 */ 0xCCCCCCCD, 0x00000000,  3, 0 }, { /*  11 */ 0xBA2E8BA3, 0x00000000,  3, 0 },
    { /*  12 */ 0xAAAAAAAB, 0x00000000,  3, 0 }, { /*  13 */ 0x9D89D89E, 0x00000000,  3, 0 },
    { /*  14 */ 0x92492492, 0x6938A22A,  3, 0 }, { /*  15 */ 0x88888889, 0x00000000,  3, 0 },
    { /*  16 */ 0x10000000, 0x00000000,  0, 0 }, { /*  17 */ 0xF0F0F0F1, 0x00000000,  4, 0 },
    { /*  18 */ 0xE38E38E4, 0x00000000,  4, 0 }, { /*  19 */ 0xD79435E5, 0xCD4F8248,  4, 0 },
    { /*  20 */ 0xCCCCCCCD, 0x00000000,  4, 0 }, { /*  21 */ 0xC30C30C3, 0xBABC20C9,  4, 0 },
    { /*  22 */ 0xBA2E8BA3, 0x00000000,  4, 0 }, { /*  23 */ 0xB21642C9, 0x00000000,  4, 0 },
    { /*  24 */ 0xAAAAAAAB, 0x00000000,  4, 0 }, { /*  25 */ 0xA3D70A3E, 0x00000000,  4, 0 },
    { /*  26 */ 0x9D89D89E, 0x00000000,  4, 0 }, { /*  27 */ 0x97B425ED, 0x92D7F3F9,  4, 0 },
    { /*  28 */ 0x92492492, 0x6938A22A,  4, 0 }, { /*  29 */ 0x8D3DCB09, 0x00000000,  4, 0 },
    { /*  30 */ 0x88888889, 0x00000000,  4, 0 }, { /*  31 */ 0x84210842, 0x7C43E5B3,  4, 0 },
    { /*  32 */ 0x08000000, 0x00000000,  0, 0 }, { /*  33 */ 0xF83E0F84, 0x00000000,  5, 0 },
    { /*  34 */ 0xF0F0F0F1, 0x00000000,  5, 0 }, { /*  35 */ 0xEA0EA0EA, 0xDDDA4CD2,  5, 0 },
    { /*  36 */ 0xE38E38E4, 0x00000000,  5, 0 }, { /*  37 */ 0xDD67C8A6, 0xD28B691D,  5, 0 },
    { /*  38 */ 0xD79435E5, 0xCD4F8248,  5, 0 }, { /*  39 */ 0xD20D20D2, 0xC85465C4,  5, 0 },
    { /*  40 */ 0xCCCCCCCD, 0x00000000,  5, 0 }, { /*  41 */ 0xC7CE0C7D, 0x00000000,  5, 0 },
    { /*  42 */ 0xC30C30C3, 0xBABC20C9,  5, 0 }, { /*  43 */ 0xBE82FA0C, 0x00000000,  5, 0 },
    { /*  44 */ 0xBA2E8BA3, 0x00000000,  5, 0 }, { /*  45 */ 0xB60B60B6, 0xAEDD2228,  5, 0 },
    { /*  46 */ 0xB21642C9, 0x00000000,  5, 0 }, { /*  47 */ 0xAE4C415D, 0x00000000,  5, 0 },
    { /*  48 */ 0xAAAAAAAB, 0x00000000,  5, 0 }, { /*  49 */ 0xA72F053A, 0x00000000,  5, 0 },
    { /*  50 */ 0xA3D70A3E, 0x00000000,  5, 0 }, { /*  51 */ 0xA0A0A0A1, 0x00000000,  5, 0 },
    { /*  52 */ 0x9D89D89E, 0x00000000,  5, 0 }, { /*  53 */ 0x9A90E7D9, 0x63EDABB9,  5, 0 },
    { /*  54 */ 0x97B425ED, 0x92D7F3F9,  5, 0 }, { /*  55 */ 0x94F2094F, 0x82BBC5D7,  5, 0 },
    { /*  56 */ 0x92492492, 0x6938A22A,  5, 0 }, { /*  57 */ 0x8FB823EE, 0x8B652615,  5, 0 },
    { /*  58 */ 0x8D3DCB09, 0x00000000,  5, 0 }, { /*  59 */ 0x8AD8F2FC, 0x00000000,  5, 0 },
    { /*  60 */ 0x88888889, 0x00000000,  5, 0 }, { /*  61 */ 0x864B8A7E, 0x00000000,  5, 0 },
    { /*  62 */ 0x84210842, 0x7C43E5B3,  5, 0 }, { /*  63 */ 0x82082082, 0x7E8DCD3B,  5, 0 },
    { /*  64 */ 0x04000000, 0x00000000,  0, 0 }, { /*  65 */ 0xFC0FC0FD, 0x00000000,  6, 0 },
    { /*  66 */ 0xF83E0F84, 0x00000000,  6, 0 }, { /*  67 */ 0xF4898D60, 0x00000000,  6, 0 },
    { /*  68 */ 0xF0F0F0F1, 0x00000000,  6, 0 }, { /*  69 */ 0xED7303B6, 0x00000000,  6, 0 },
    { /*  70 */ 0xEA0EA0EA, 0xDDDA4CD2,  6, 0 }, { /*  71 */ 0xE6C2B449, 0x00000000,  6, 0 },
    { /*  72 */ 0xE38E38E4, 0x00000000,  6, 0 }, { /*  73 */ 0xE070381C, 0xD54336DB,  6, 0 },
    { /*  74 */ 0xDD67C8A6, 0xD28B691D,  6, 0 }, { /*  75 */ 0xDA740DA8, 0x00000000,  6, 0 },
    { /*  76 */ 0xD79435E5, 0xCD4F8248,  6, 0 }, { /*  77 */ 0xD4C77B04, 0x00000000,  6, 0 },
    { /*  78 */ 0xD20D20D2, 0xC85465C4,  6, 0 }, { /*  79 */ 0xCF6474A9, 0x00000000,  6, 0 },
    { /*  80 */ 0xCCCCCCCD, 0x00000000,  6, 0 }, { /*  81 */ 0xCA4587E7, 0x00000000,  6, 0 },
    { /*  82 */ 0xC7CE0C7D, 0x00000000,  6, 0 }, { /*  83 */ 0xC565C87C, 0x00000000,  6, 0 },
    { /*  84 */ 0xC30C30C3, 0xBABC20C9,  6, 0 }, { /*  85 */ 0xC0C0C0C1, 0x00000000,  6, 0 },
    { /*  86 */ 0xBE82FA0C, 0x00000000,  6, 0 }, { /*  87 */ 0xBC52640C, 0x00000000,  6, 0 },
    { /*  88 */ 0xBA2E8BA3, 0x00000000,  6, 0 }, { /*  89 */ 0xB81702E1, 0x00000000,  6, 0 },
    { /*  90 */ 0xB60B60B6, 0xAEDD2228,  6, 0 }, { /*  91 */ 0xB40B40B4, 0xAD07B849,  6, 0 },
    { /*  92 */ 0xB21642C9, 0x00000000,  6, 0 }, { /*  93 */ 0xB02C0B03, 0x00000000,  6, 0 },
    { /*  94 */ 0xAE4C415D, 0x00000000,  6, 0 }, { /*  95 */ 0xAC769184, 0xA6105997,  6, 0 },
    { /*  96 */ 0xAAAAAAAB, 0x00000000,  6, 0 }, { /*  97 */ 0xA8E83F57, 0x9A147789,  6, 0 },
    { /*  98 */ 0xA72F053A, 0x00000000,  6, 0 }, { /*  99 */ 0xA57EB503, 0x00000000,  6, 0 },
    { /* 100 */ 0xA3D70A3E, 0x00000000,  6, 0 }, { /* 101 */ 0xA237C32B, 0x9492E852,  6, 0 },
    { /* 102 */ 0xA0A0A0A1, 0x00000000,  6, 0 }, { /* 103 */ 0x9F1165E7, 0x88B2B450,  6, 0 },
    { /* 104 */ 0x9D89D89E, 0x00000000,  6, 0 }, { /* 105 */ 0x9C09C09C, 0x96DFBCFA,  6, 0 },
    { /* 106 */ 0x9A90E7D9, 0x63EDABB9,  6, 0 }, { /* 107 */ 0x991F1A51, 0x64F044B4,  6, 0 },
    { /* 108 */ 0x97B425ED, 0x92D7F3F9,  6, 0 }, { /* 109 */ 0x964FDA6C, 0x918C25D4,  6, 0 },
    { /* 110 */ 0x94F2094F, 0x82BBC5D7,  6, 0 }, { /* 111 */ 0x939A85C4, 0x8F05C755,  6, 0 },
    { /* 112 */ 0x92492492, 0x6938A22A,  6, 0 }, { /* 113 */ 0x90FDBC09, 0x88BBFE97,  6, 0 },
    { /* 114 */ 0x8FB823EE, 0x8B652615,  6, 0 }, { /* 115 */ 0x8E78356D, 0x84083914,  6, 0 },
    { /* 116 */ 0x8D3DCB09, 0x00000000,  6, 0 }, { /* 117 */ 0x8C08C08C, 0x87F265C4,  6, 0 },
    { /* 118 */ 0x8AD8F2FC, 0x00000000,  6, 0 }, { /* 119 */ 0x89AE408A, 0x00000000,  6, 0 },
    { /* 120 */ 0x88888889, 0x00000000,  6, 0 }, { /* 121 */ 0x8767AB5F, 0x6C1B1295,  6, 0 },
    { /* 122 */ 0x864B8A7E, 0x00000000,  6, 0 }, { /* 123 */ 0x85340853, 0x644C372D,  6, 0 },
    { /* 124 */ 0x84210842, 0x7C43E5B3,  6, 0 }, { /* 125 */ 0x83126E98, 0x00000000,  6, 0 },
    { /* 126 */ 0x82082082, 0x7E8DCD3B,  6, 0 }, { /* 127 */ 0x81020408, 0x7986C452,  6, 0 },
    { /* 128 */ 0x02000000, 0x00000000,  0, 0 }, { /* 129 */ 0xFE03F810, 0x00000000,  7, 0 },
    { /* 130 */ 0xFC0FC0FD, 0x00000000,  7, 0 }, { /* 131 */ 0xFA232CF3, 0x00000000,  7, 0 },
    { /* 132 */ 0xF83E0F84, 0x00000000,  7, 0 }, { /* 133 */ 0xF6603D99, 0x00000000,  7, 0 },
    { /* 134 */ 0xF4898D60, 0x00000000,  7, 0 }, { /* 135 */ 0xF2B9D649, 0x00000000,  7, 0 },
    { /* 136 */ 0xF0F0F0F1, 0x00000000,  7, 0 }, { /* 137 */ 0xEF2EB720, 0x00000000,  7, 0 },
    { /* 138 */ 0xED7303B6, 0x00000000,  7, 0 }, { /* 139 */ 0xEBBDB2A6, 0x00000000,  7, 0 },
    { /* 140 */ 0xEA0EA0EA, 0xDDDA4CD2,  7, 0 }, { /* 141 */ 0xE865AC7C, 0x00000000,  7, 0 },
    { /* 142 */ 0xE6C2B449, 0x00000000,  7, 0 }, { /* 143 */ 0xE525982B, 0x00000000,  7, 0 },
    { /* 144 */ 0xE38E38E4, 0x00000000,  7, 0 }, { /* 145 */ 0xE1FC780F, 0x00000000,  7, 0 },
    { /* 146 */ 0xE070381C, 0xD54336DB,  7, 0 }, { /* 147 */ 0xDEE95C4D, 0x00000000,  7, 0 },
    { /* 148 */ 0xDD67C8A6, 0xD28B691D,  7, 0 }, { /* 149 */ 0xDBEB61EF, 0x00000000,  7, 0 },
    { /* 150 */ 0xDA740DA8, 0x00000000,  7, 0 }, { /* 151 */ 0xD901B204, 0x00000000,  7, 0 },
    { /* 152 */ 0xD79435E5, 0xCD4F8248,  7, 0 }, { /* 153 */ 0xD62B80D7, 0x00000000,  7, 0 },
    { /* 154 */ 0xD4C77B04, 0x00000000,  7, 0 }, { /* 155 */ 0xD3680D37, 0x00000000,  7, 0 },
    { /* 156 */ 0xD20D20D2, 0xC85465C4,  7, 0 }, { /* 157 */ 0xD0B69FCC, 0x00000000,  7, 0 },
    { /* 158 */ 0xCF6474A9, 0x00000000,  7, 0 }, { /* 159 */ 0xCE168A77, 0xB14E984F,  7, 0 },
    { /* 160 */ 0xCCCCCCCD, 0x00000000,  7, 0 }, { /* 161 */ 0xCB8727C1, 0x00000000,  7, 0 },
    { /* 162 */ 0xCA4587E7, 0x00000000,  7, 0 }, { /* 163 */ 0xC907DA4F, 0x00000000,  7, 0 },
    { /* 164 */ 0xC7CE0C7D, 0x00000000,  7, 0 }, { /* 165 */ 0xC6980C6A, 0x00000000,  7, 0 },
    { /* 166 */ 0xC565C87C, 0x00000000,  7, 0 }, { /* 167 */ 0xC4372F86, 0x00000000,  7, 0 },
    { /* 168 */ 0xC30C30C3, 0xBABC20C9,  7, 0 }, { /* 169 */ 0xC1E4BBD6, 0x00000000,  7, 0 },
    { /* 170 */ 0xC0C0C0C1, 0x00000000,  7, 0 }, { /* 171 */ 0xBFA02FE8, 0xB79E7117,  7, 0 },
    { /* 172 */ 0xBE82FA0C, 0x00000000,  7, 0 }, { /* 173 */ 0xBD691047, 0xB8E21743,  7, 0 },
    { /* 174 */ 0xBC52640C, 0x00000000,  7, 0 }, { /* 175 */ 0xBB3EE722, 0x00000000,  7, 0 },
    { /* 176 */ 0xBA2E8BA3, 0x00000000,  7, 0 }, { /* 177 */ 0xB92143FA, 0x924F680F,  7, 0 },
    { /* 178 */ 0xB81702E1, 0x00000000,  7, 0 }, { /* 179 */ 0xB70FBB5A, 0xA5917F18,  7, 0 },
    { /* 180 */ 0xB60B60B6, 0xAEDD2228,  7, 0 }, { /* 181 */ 0xB509E68B, 0x00000000,  7, 0 },
    { /* 182 */ 0xB40B40B4, 0xAD07B849,  7, 0 }, { /* 183 */ 0xB30F6353, 0x00000000,  7, 0 },
    { /* 184 */ 0xB21642C9, 0x00000000,  7, 0 }, { /* 185 */ 0xB11FD3B8, 0xAA59BB65,  7, 0 },
    { /* 186 */ 0xB02C0B03, 0x00000000,  7, 0 }, { /* 187 */ 0xAF3ADDC7, 0x00000000,  7, 0 },
    { /* 188 */ 0xAE4C415D, 0x00000000,  7, 0 }, { /* 189 */ 0xAD602B58, 0xA6E76529,  7, 0 },
    { /* 190 */ 0xAC769184, 0xA6105997,  7, 0 }, { /* 191 */ 0xAB8F69E3, 0x00000000,  7, 0 },
    { /* 192 */ 0xAAAAAAAB, 0x00000000,  7, 0 }, { /* 193 */ 0xA9C84A48, 0x00000000,  7, 0 },
    { /* 194 */ 0xA8E83F57, 0x9A147789,  7, 0 }, { /* 195 */ 0xA80A80A8, 0xA1FCBBC2,  7, 0 },
    { /* 196 */ 0xA72F053A, 0x00000000,  7, 0 }, { /* 197 */ 0xA655C439, 0x899D6309,  7, 0 },
    { /* 198 */ 0xA57EB503, 0x00000000,  7, 0 }, { /* 199 */ 0xA4A9CF1E, 0x00000000,  7, 0 },
    { /* 200 */ 0xA3D70A3E, 0x00000000,  7, 0 }, { /* 201 */ 0xA3065E40, 0x00000000,  7, 0 },
    { /* 202 */ 0xA237C32B, 0x9492E852,  7, 0 }, { /* 203 */ 0xA16B312F, 0x00000000,  7, 0 },
    { /* 204 */ 0xA0A0A0A1, 0x00000000,  7, 0 }, { /* 205 */ 0x9FD809FE, 0x00000000,  7, 0 },
    { /* 206 */ 0x9F1165E7, 0x88B2B450,  7, 0 }, { /* 207 */ 0x9E4CAD24, 0x00000000,  7, 0 },
    { /* 208 */ 0x9D89D89E, 0x00000000,  7, 0 }, { /* 209 */ 0x9CC8E161, 0x00000000,  7, 0 },
    { /* 210 */ 0x9C09C09C, 0x96DFBCFA,  7, 0 }, { /* 211 */ 0x9B4C6F9F, 0x00000000,  7, 0 },
    { /* 212 */ 0x9A90E7D9, 0x63EDABB9,  7, 0 }, { /* 213 */ 0x99D722DB, 0x00000000,  7, 0 },
    { /* 214 */ 0x991F1A51, 0x64F044B4,  7, 0 }, { /* 215 */ 0x9868C80A, 0x00000000,  7, 0 },
    { /* 216 */ 0x97B425ED, 0x92D7F3F9,  7, 0 }, { /* 217 */ 0x97012E02, 0x617B4216,  7, 0 },
    { /* 218 */ 0x964FDA6C, 0x918C25D4,  7, 0 }, { /* 219 */ 0x95A02568, 0x90E86DBA,  7, 0 },
    { /* 220 */ 0x94F2094F, 0x82BBC5D7,  7, 0 }, { /* 221 */ 0x94458094, 0x6CC215E5,  7, 0 },
    { /* 222 */ 0x939A85C4, 0x8F05C755,  7, 0 }, { /* 223 */ 0x92F11384, 0x910A6A75,  7, 0 },
    { /* 224 */ 0x92492492, 0x6938A22A,  7, 0 }, { /* 225 */ 0x91A2B3C5, 0x00000000,  7, 0 },
    { /* 226 */ 0x90FDBC09, 0x88BBFE97,  7, 0 }, { /* 227 */ 0x905A3863, 0x6E19535E,  7, 0 },
    { /* 228 */ 0x8FB823EE, 0x8B652615,  7, 0 }, { /* 229 */ 0x8F1779DA, 0x00000000,  7, 0 },
    { /* 230 */ 0x8E78356D, 0x84083914,  7, 0 }, { /* 231 */ 0x8DDA5202, 0x6FDBA642,  7, 0 },
    { /* 232 */ 0x8D3DCB09, 0x00000000,  7, 0 }, { /* 233 */ 0x8CA29C04, 0x55CEFFF7,  7, 0 },
    { /* 234 */ 0x8C08C08C, 0x87F265C4,  7, 0 }, { /* 235 */ 0x8B70344A, 0x81748207,  7, 0 },
    { /* 236 */ 0x8AD8F2FC, 0x00000000,  7, 0 }, { /* 237 */ 0x8A42F870, 0x5C4846A5,  7, 0 },
    { /* 238 */ 0x89AE408A, 0x00000000,  7, 0 }, { /* 239 */ 0x891AC73B, 0x00000000,  7, 0 },
    { /* 240 */ 0x88888889, 0x00000000,  7, 0 }, { /* 241 */ 0x87F78088, 0x00000000,  7, 0 },
    { /* 242 */ 0x8767AB5F, 0x6C1B1295,  7, 0 }, { /* 243 */ 0x86D90545, 0x00000000,  7, 0 },
    { /* 244 */ 0x864B8A7E, 0x00000000,  7, 0 }, { /* 245 */ 0x85BF3761, 0x6EF1149F,  7, 0 },
    { /* 246 */ 0x85340853, 0x644C372D,  7, 0 }, { /* 247 */ 0x84A9F9C8, 0x8107CD75,  7, 0 },
    { /* 248 */ 0x84210842, 0x7C43E5B3,  7, 0 }, { /* 249 */ 0x83993052, 0x637D2978,  7, 0 },
    { /* 250 */ 0x83126E98, 0x00000000,  7, 0 }, { /* 251 */ 0x828CBFBF, 0x00000000,  7, 0 },
    { /* 252 */ 0x82082082, 0x7E8DCD3B,  7, 0 }, { /* 253 */ 0x81848DA9, 0x00000000,  7, 0 },
    { /* 254 */ 0x81020408, 0x7986C452,  7, 0 }, { /* 255 */ 0x80808081, 0x00000000,  7, 0 },
    { /* 256 */ 0x01000000, 0x00000000,  0, 0 }, { /* 257 */ 0xFF00FF01, 0x00000000,  8, 0 },
    { /* 258 */ 0xFE03F810, 0x00000000,  8, 0 }, { /* 259 */ 0xFD08E551, 0x00000000,  8, 0 },
    { /* 260 */ 0xFC0FC0FD, 0x00000000,  8, 0 }, { /* 261 */ 0xFB188566, 0x00000000,  8, 0 },
    { /* 262 */ 0xFA232CF3, 0x00000000,  8, 0 }, { /* 263 */ 0xF92FB222, 0x00000000,  8, 0 },
    { /* 264 */ 0xF83E0F84, 0x00000000,  8, 0 }, { /* 265 */ 0xF74E3FC3, 0x00000000,  8, 0 },
    { /* 266 */ 0xF6603D99, 0x00000000,  8, 0 }, { /* 267 */ 0xF57403D6, 0x00000000,  8, 0 },
    { /* 268 */ 0xF4898D60, 0x00000000,  8, 0 }, { /* 269 */ 0xF3A0D52D, 0x00000000,  8, 0 },
    { /* 270 */ 0xF2B9D649, 0x00000000,  8, 0 }, { /* 271 */ 0xF1D48BCF, 0x00000000,  8, 0 },
    { /* 272 */ 0xF0F0F0F1, 0x00000000,  8, 0 }, { /* 273 */ 0xF00F00F0, 0xE330852D,  8, 0 },
    { /* 274 */ 0xEF2EB720, 0x00000000,  8, 0 }, { /* 275 */ 0xEE500EE5, 0xEE500EE5,  8, 0 },
    { /* 276 */ 0xED7303B6, 0x00000000,  8, 0 }, { /* 277 */ 0xEC979119, 0x00000000,  8, 0 },
    { /* 278 */ 0xEBBDB2A6, 0x00000000,  8, 0 }, { /* 279 */ 0xEAE56404, 0x00000000,  8, 0 },
    { /* 280 */ 0xEA0EA0EA, 0xDDDA4CD2,  8, 0 }, { /* 281 */ 0xE9396520, 0x00000000,  8, 0 },
    { /* 282 */ 0xE865AC7C, 0x00000000,  8, 0 }, { /* 283 */ 0xE79372E3, 0x00000000,  8, 0 },
    { /* 284 */ 0xE6C2B449, 0x00000000,  8, 0 }, { /* 285 */ 0xE5F36CB0, 0xDA30EC7F,  8, 0 },
    { /* 286 */ 0xE525982B, 0x00000000,  8, 0 }, { /* 287 */ 0xE45932D8, 0x00000000,  8, 0 },
    { /* 288 */ 0xE38E38E4, 0x00000000,  8, 0 }, { /* 289 */ 0xE2C4A689, 0x00000000,  8, 0 },
    { /* 290 */ 0xE1FC780F, 0x00000000,  8, 0 }, { /* 291 */ 0xE135A9CA, 0x00000000,  8, 0 },
    { /* 292 */ 0xE070381C, 0xD54336DB,  8, 0 }, { /* 293 */ 0xDFAC1F75, 0x00000000,  8, 0 },
    { /* 294 */ 0xDEE95C4D, 0x00000000,  8, 0 }, { /* 295 */ 0xDE27EB2D, 0x00000000,  8, 0 },
    { /* 296 */ 0xDD67C8A6, 0xD28B691D,  8, 0 }, { /* 297 */ 0xDCA8F159, 0x00000000,  8, 0 },
    { /* 298 */ 0xDBEB61EF, 0x00000000,  8, 0 }, { /* 299 */ 0xDB2F171E, 0x00000000,  8, 0 },
    { /* 300 */ 0xDA740DA8, 0x00000000,  8, 0 }, { /* 301 */ 0xD9BA4257, 0x00000000,  8, 0 },
    { /* 302 */ 0xD901B204, 0x00000000,  8, 0 }, { /* 303 */ 0xD84A598F, 0x00000000,  8, 0 },
    { /* 304 */ 0xD79435E5, 0xCD4F8248,  8, 0 }, { /* 305 */ 0xD6DF43FD, 0x00000000,  8, 0 },
    { /* 306 */ 0xD62B80D7, 0x00000000,  8, 0 }, { /* 307 */ 0xD578E97D, 0x00000000,  8, 0 },
    { /* 308 */ 0xD4C77B04, 0x00000000,  8, 0 }, { /* 309 */ 0xD417328A, 0x00000000,  8, 0 },
    { /* 310 */ 0xD3680D37, 0x00000000,  8, 0 }, { /* 311 */ 0xD2BA083C, 0x00000000,  8, 0 },
    { /* 312 */ 0xD20D20D2, 0xC85465C4,  8, 0 }, { /* 313 */ 0xD161543E, 0xB0FAD2B5,  8, 0 },
    { /* 314 */ 0xD0B69FCC, 0x00000000,  8, 0 }, { /* 315 */ 0xD00D00D0, 0xC685FCC5,  8, 0 },
    { /* 316 */ 0xCF6474A9, 0x00000000,  8, 0 }, { /* 317 */ 0xCEBCF8BC, 0x00000000,  8, 0 },
    { /* 318 */ 0xCE168A77, 0xB14E984F,  8, 0 }, { /* 319 */ 0xCD712753, 0x00000000,  8, 0 },
    { /* 320 */ 0xCCCCCCCD, 0x00000000,  8, 0 }, { /* 321 */ 0xCC29786D, 0x00000000,  8, 0 },
    { /* 322 */ 0xCB8727C1, 0x00000000,  8, 0 }, { /* 323 */ 0xCAE5D85F, 0xB5ED2E5D,  8, 0 },
    { /* 324 */ 0xCA4587E7, 0x00000000,  8, 0 }, { /* 325 */ 0xC9A633FD, 0x00000000,  8, 0 },
    { /* 326 */ 0xC907DA4F, 0x00000000,  8, 0 }, { /* 327 */ 0xC86A7890, 0xBF9C984D,  8, 0 },
    { /* 328 */ 0xC7CE0C7D, 0x00000000,  8, 0 }, { /* 329 */ 0xC73293D8, 0x00000000,  8, 0 },
    { /* 330 */ 0xC6980C6A, 0x00000000,  8, 0 }, { /* 331 */ 0xC5FE7403, 0xB470D0D8,  8, 0 },
    { /* 332 */ 0xC565C87C, 0x00000000,  8, 0 }, { /* 333 */ 0xC4CE07B0, 0xBC552E96,  8, 0 },
    { /* 334 */ 0xC4372F86, 0x00000000,  8, 0 }, { /* 335 */ 0xC3A13DE6, 0xC11AABA8,  8, 0 },
    { /* 336 */ 0xC30C30C3, 0xBABC20C9,  8, 0 }, { /* 337 */ 0xC2780614, 0x00000000,  8, 0 },
    { /* 338 */ 0xC1E4BBD6, 0x00000000,  8, 0 }, { /* 339 */ 0xC152500C, 0xB252119D,  8, 0 },
    { /* 340 */ 0xC0C0C0C1, 0x00000000,  8, 0 }, { /* 341 */ 0xC0300C03, 0xC0300C03,  8, 0 },
    { /* 342 */ 0xBFA02FE8, 0xB79E7117,  8, 0 }, { /* 343 */ 0xBF112A8B, 0x00000000,  8, 0 },
    { /* 344 */ 0xBE82FA0C, 0x00000000,  8, 0 }, { /* 345 */ 0xBDF59C92, 0x00000000,  8, 0 },
    { /* 346 */ 0xBD691047, 0xB8E21743,  8, 0 }, { /* 347 */ 0xBCDD535E, 0x00000000,  8, 0 },
    { /* 348 */ 0xBC52640C, 0x00000000,  8, 0 }, { /* 349 */ 0xBBC8408D, 0x00000000,  8, 0 },
    { /* 350 */ 0xBB3EE722, 0x00000000,  8, 0 }, { /* 351 */ 0xBAB65610, 0xB3227C7F,  8, 0 },
    { /* 352 */ 0xBA2E8BA3, 0x00000000,  8, 0 }, { /* 353 */ 0xB9A7862A, 0xAF031B3B,  8, 0 },
    { /* 354 */ 0xB92143FA, 0x924F680F,  8, 0 }, { /* 355 */ 0xB89BC36D, 0x00000000,  8, 0 },
    { /* 356 */ 0xB81702E1, 0x00000000,  8, 0 }, { /* 357 */ 0xB79300B8, 0x00000000,  8, 0 },
    { /* 358 */ 0xB70FBB5A, 0xA5917F18,  8, 0 }, { /* 359 */ 0xB68D3134, 0xAD4B5673,  8, 0 },
    { /* 360 */ 0xB60B60B6, 0xAEDD2228,  8, 0 }, { /* 361 */ 0xB58A4855, 0xA4D8D64B,  8, 0 },
    { /* 362 */ 0xB509E68B, 0x00000000,  8, 0 }, { /* 363 */ 0xB48A39D4, 0x83B505FC,  8, 0 },
    { /* 364 */ 0xB40B40B4, 0xAD07B849,  8, 0 }, { /* 365 */ 0xB38CF9B0, 0xAC93E5AE,  8, 0 },
    { /* 366 */ 0xB30F6353, 0x00000000,  8, 0 }, { /* 367 */ 0xB2927C2A, 0x00000000,  8, 0 },
    { /* 368 */ 0xB21642C9, 0x00000000,  8, 0 }, { /* 369 */ 0xB19AB5C5, 0x00000000,  8, 0 },
    { /* 370 */ 0xB11FD3B8, 0xAA59BB65,  8, 0 }, { /* 371 */ 0xB0A59B42, 0x00000000,  8, 0 },
    { /* 372 */ 0xB02C0B03, 0x00000000,  8, 0 }, { /* 373 */ 0xAFB321A1, 0x7E2D2A91,  8, 0 },
    { /* 374 */ 0xAF3ADDC7, 0x00000000,  8, 0 }, { /* 375 */ 0xAEC33E20, 0x00000000,  8, 0 },
    { /* 376 */ 0xAE4C415D, 0x00000000,  8, 0 }, { /* 377 */ 0xADD5E632, 0x835C71C6,  8, 0 },
    { /* 378 */ 0xAD602B58, 0xA6E76529,  8, 0 }, { /* 379 */ 0xACEB0F89, 0x9940699B,  8, 0 },
    { /* 380 */ 0xAC769184, 0xA6105997,  8, 0 }, { /* 381 */ 0xAC02B00B, 0x00000000,  8, 0 },
    { /* 382 */ 0xAB8F69E3, 0x00000000,  8, 0 }, { /* 383 */ 0xAB1CBDD4, 0x00000000,  8, 0 },
    { /* 384 */ 0xAAAAAAAB, 0x00000000,  8, 0 }, { /* 385 */ 0xAA392F36, 0x00000000,  8, 0 },
    { /* 386 */ 0xA9C84A48, 0x00000000,  8, 0 }, { /* 387 */ 0xA957FAB5, 0x7FBEBD3E,  8, 0 },
    { /* 388 */ 0xA8E83F57, 0x9A147789,  8, 0 }, { /* 389 */ 0xA8791709, 0x00000000,  8, 0 },
    { /* 390 */ 0xA80A80A8, 0xA1FCBBC2,  8, 0 }, { /* 391 */ 0xA79C7B17, 0x00000000,  8, 0 },
    { /* 392 */ 0xA72F053A, 0x00000000,  8, 0 }, { /* 393 */ 0xA6C21DF7, 0x00000000,  8, 0 },
    { /* 394 */ 0xA655C439, 0x899D6309,  8, 0 }, { /* 395 */ 0xA5E9F6ED, 0x84B87BC1,  8, 0 },
    { /* 396 */ 0xA57EB503, 0x00000000,  8, 0 }, { /* 397 */ 0xA513FD6C, 0x00000000,  8, 0 },
    { /* 398 */ 0xA4A9CF1E, 0x00000000,  8, 0 }, { /* 399 */ 0xA4402910, 0x9E7C426A,  8, 0 },
    { /* 400 */ 0xA3D70A3E, 0x00000000,  8, 0 }, { /* 401 */ 0xA36E71A3, 0x00000000,  8, 0 },
    { /* 402 */ 0xA3065E40, 0x00000000,  8, 0 }, { /* 403 */ 0xA29ECF16, 0x7D808D0C,  8, 0 },
    { /* 404 */ 0xA237C32B, 0x9492E852,  8, 0 }, { /* 405 */ 0xA1D13986, 0x00000000,  8, 0 },
    { /* 406 */ 0xA16B312F, 0x00000000,  8, 0 }, { /* 407 */ 0xA105A933, 0x00000000,  8, 0 },
    { /* 408 */ 0xA0A0A0A1, 0x00000000,  8, 0 }, { /* 409 */ 0xA03C1689, 0x00000000,  8, 0 },
    { /* 410 */ 0x9FD809FE, 0x00000000,  8, 0 }, { /* 411 */ 0x9F747A15, 0x83EE3A17,  8, 0 },
    { /* 412 */ 0x9F1165E7, 0x88B2B450,  8, 0 }, { /* 413 */ 0x9EAECC8D, 0x6B9B462C,  8, 0 },
    { /* 414 */ 0x9E4CAD24, 0x00000000,  8, 0 }, { /* 415 */ 0x9DEB06C9, 0x8F1B2A8F,  8, 0 },
    { /* 416 */ 0x9D89D89E, 0x00000000,  8, 0 }, { /* 417 */ 0x9D2921C4, 0x00000000,  8, 0 },
    { /* 418 */ 0x9CC8E161, 0x00000000,  8, 0 }, { /* 419 */ 0x9C69169B, 0x7FB3C7DA,  8, 0 },
    { /* 420 */ 0x9C09C09C, 0x96DFBCFA,  8, 0 }, { /* 421 */ 0x9BAADE8E, 0x6F55E409,  8, 0 },
    { /* 422 */ 0x9B4C6F9F, 0x00000000,  8, 0 }, { /* 423 */ 0x9AEE72FD, 0x00000000,  8, 0 },
    { /* 424 */ 0x9A90E7D9, 0x63EDABB9,  8, 0 }, { /* 425 */ 0x9A33CD67, 0x9A33CD67,  8, 0 },
    { /* 426 */ 0x99D722DB, 0x00000000,  8, 0 }, { /* 427 */ 0x997AE76B, 0x69B92CFD,  8, 0 },
    { /* 428 */ 0x991F1A51, 0x64F044B4,  8, 0 }, { /* 429 */ 0x98C3BAC7, 0x6A2AF5E1,  8, 0 },
    { /* 430 */ 0x9868C80A, 0x00000000,  8, 0 }, { /* 431 */ 0x980E4156, 0x85C3D0A8,  8, 0 },
    { /* 432 */ 0x97B425ED, 0x92D7F3F9,  8, 0 }, { /* 433 */ 0x975A7510, 0x00000000,  8, 0 },
    { /* 434 */ 0x97012E02, 0x617B4216,  8, 0 }, { /* 435 */ 0x96A8500A, 0x00000000,  8, 0 },
    { /* 436 */ 0x964FDA6C, 0x918C25D4,  8, 0 }, { /* 437 */ 0x95F7CC73, 0x00000000,  8, 0 },
    { /* 438 */ 0x95A02568, 0x90E86DBA,  8, 0 }, { /* 439 */ 0x9548E498, 0x00000000,  8, 0 },
    { /* 440 */ 0x94F2094F, 0x82BBC5D7,  8, 0 }, { /* 441 */ 0x949B92DE, 0x00000000,  8, 0 },
    { /* 442 */ 0x94458094, 0x6CC215E5,  8, 0 }, { /* 443 */ 0x93EFD1C5, 0x8C53F151,  8, 0 },
    { /* 444 */ 0x939A85C4, 0x8F05C755,  8, 0 }, { /* 445 */ 0x93459BE7, 0x00000000,  8, 0 },
    { /* 446 */ 0x92F11384, 0x910A6A75,  8, 0 }, { /* 447 */ 0x929CEBF5, 0x00000000,  8, 0 },
    { /* 448 */ 0x92492492, 0x6938A22A,  8, 0 }, { /* 449 */ 0x91F5BCB9, 0x00000000,  8, 0 },
    { /* 450 */ 0x91A2B3C5, 0x00000000,  8, 0 }, { /* 451 */ 0x91500915, 0x91500915,  8, 0 },
    { /* 452 */ 0x90FDBC09, 0x88BBFE97,  8, 0 }, { /* 453 */ 0x90ABCC02, 0x6BB5AEA5,  8, 0 },
    { /* 454 */ 0x905A3863, 0x6E19535E,  8, 0 }, { /* 455 */ 0x90090090, 0x8BB0BBF2,  8, 0 },
    { /* 456 */ 0x8FB823EE, 0x8B652615,  8, 0 }, { /* 457 */ 0x8F67A1E4, 0x00000000,  8, 0 },
    { /* 458 */ 0x8F1779DA, 0x00000000,  8, 0 }, { /* 459 */ 0x8EC7AB3A, 0x00000000,  8, 0 },
    { /* 460 */ 0x8E78356D, 0x84083914,  8, 0 }, { /* 461 */ 0x8E2917E1, 0x00000000,  8, 0 },
    { /* 462 */ 0x8DDA5202, 0x6FDBA642,  8, 0 }, { /* 463 */ 0x8D8BE340, 0x00000000,  8, 0 },
    { /* 464 */ 0x8D3DCB09, 0x00000000,  8, 0 }, { /* 465 */ 0x8CF008CF, 0x8CF008CF,  8, 0 },
    { /* 466 */ 0x8CA29C04, 0x55CEFFF7,  8, 0 }, { /* 467 */ 0x8C55841D, 0x00000000,  8, 0 },
    { /* 468 */ 0x8C08C08C, 0x87F265C4,  8, 0 }, { /* 469 */ 0x8BBC50C9, 0x00000000,  8, 0 },
    { /* 470 */ 0x8B70344A, 0x81748207,  8, 0 }, { /* 471 */ 0x8B246A88, 0x00000000,  8, 0 },
    { /* 472 */ 0x8AD8F2FC, 0x00000000,  8, 0 }, { /* 473 */ 0x8A8DCD20, 0x00000000,  8, 0 },
    { /* 474 */ 0x8A42F870, 0x5C4846A5,  8, 0 }, { /* 475 */ 0x89F8746A, 0x00000000,  8, 0 },
    { /* 476 */ 0x89AE408A, 0x00000000,  8, 0 }, { /* 477 */ 0x89645C4F, 0x4F0837E6,  8, 0 },
    { /* 478 */ 0x891AC73B, 0x00000000,  8, 0 }, { /* 479 */ 0x88D180CD, 0x6A5E515C,  8, 0 },
    { /* 480 */ 0x88888889, 0x00000000,  8, 0 }, { /* 481 */ 0x883FDDF0, 0x8466056E,  8, 0 },
    { /* 482 */ 0x87F78088, 0x00000000,  8, 0 }, { /* 483 */ 0x87AF6FD6, 0x00000000,  8, 0 },
    { /* 484 */ 0x8767AB5F, 0x6C1B1295,  8, 0 }, { /* 485 */ 0x872032AC, 0x7DC57D99,  8, 0 },
    { /* 486 */ 0x86D90545, 0x00000000,  8, 0 }, { /* 487 */ 0x869222B2, 0x00000000,  8, 0 },
    { /* 488 */ 0x864B8A7E, 0x00000000,  8, 0 }, { /* 489 */ 0x86053C34, 0x578CE94B,  8, 0 },
    { /* 490 */ 0x85BF3761, 0x6EF1149F,  8, 0 }, { /* 491 */ 0x85797B91, 0x47E3D9B3,  8, 0 },
    { /* 492 */ 0x85340853, 0x644C372D,  8, 0 }, { /* 493 */ 0x84EEDD36, 0x00000000,  8, 0 },
    { /* 494 */ 0x84A9F9C8, 0x8107CD75,  8, 0 }, { /* 495 */ 0x84655D9C, 0x00000000,  8, 0 },
    { /* 496 */ 0x84210842, 0x7C43E5B3,  8, 0 }, { /* 497 */ 0x83DCF94E, 0x00000000,  8, 0 },
    { /* 498 */ 0x83993052, 0x637D2978,  8, 0 }, { /* 499 */ 0x8355ACE4, 0x00000000,  8, 0 },
    { /* 500 */ 0x83126E98, 0x00000000,  8, 0 }, { /* 501 */ 0x82CF7504, 0x00000000,  8, 0 },
    { /* 502 */ 0x828CBFBF, 0x00000000,  8, 0 }, { /* 503 */ 0x824A4E61, 0x00000000,  8, 0 },
    { /* 504 */ 0x82082082, 0x7E8DCD3B,  8, 0 }, { /* 505 */ 0x81C635BC, 0x792C0147,  8, 0 },
    { /* 506 */ 0x81848DA9, 0x00000000,  8, 0 }, { /* 507 */ 0x814327E4, 0x00000000,  8, 0 },
    { /* 508 */ 0x81020408, 0x7986C452,  8, 0 }, { /* 509 */ 0x80C121B3, 0x00000000,  8, 0 },
    { /* 510 */ 0x80808081, 0x00000000,  8, 0 }, { /* 511 */ 0x80402010, 0x7CE0462C,  8, 0 },
};

static const DivRatio32 div_ratio_tbl32_64[kMaxDivTable] = {
    { /*   0 */ 0x00000000, 0x00000000, 32, 0 }, { /*   1 */ 0xFFFFFFFF, 0xFFFFFFFF, 32, 0 },
    { /*   2 */ 0x80000000, 0x00000000, 32, 0 }, { /*   3 */ 0xAAAAAAAB, 0x00000000, 33, 0 },
    { /*   4 */ 0x40000000, 0x00000000, 32, 0 }, { /*   5 */ 0xCCCCCCCD, 0x00000000, 34, 0 },
    { /*   6 */ 0xAAAAAAAB, 0x00000000, 34, 0 }, { /*   7 */ 0x92492492, 0x92492492, 34, 0 },
    { /*   8 */ 0x20000000, 0x00000000, 32, 0 }, { /*   9 */ 0xE38E38E4, 0x00000000, 35, 0 },
    { /*  10 */ 0xCCCCCCCD, 0x00000000, 35, 0 }, { /*  11 */ 0xBA2E8BA3, 0x00000000, 35, 0 },
    { /*  12 */ 0xAAAAAAAB, 0x00000000, 35, 0 }, { /*  13 */ 0x9D89D89E, 0x00000000, 35, 0 },
    { /*  14 */ 0x92492492, 0x92492492, 35, 0 }, { /*  15 */ 0x88888889, 0x00000000, 35, 0 },
    { /*  16 */ 0x10000000, 0x00000000, 32, 0 }, { /*  17 */ 0xF0F0F0F1, 0x00000000, 36, 0 },
    { /*  18 */ 0xE38E38E4, 0x00000000, 36, 0 }, { /*  19 */ 0xD79435E5, 0xD79435E5, 36, 0 },
    { /*  20 */ 0xCCCCCCCD, 0x00000000, 36, 0 }, { /*  21 */ 0xC30C30C3, 0xC30C30C3, 36, 0 },
    { /*  22 */ 0xBA2E8BA3, 0x00000000, 36, 0 }, { /*  23 */ 0xB21642C9, 0x00000000, 36, 0 },
    { /*  24 */ 0xAAAAAAAB, 0x00000000, 36, 0 }, { /*  25 */ 0xA3D70A3E, 0x00000000, 36, 0 },
    { /*  26 */ 0x9D89D89E, 0x00000000, 36, 0 }, { /*  27 */ 0x97B425ED, 0x97B425ED, 36, 0 },
    { /*  28 */ 0x92492492, 0x92492492, 36, 0 }, { /*  29 */ 0x8D3DCB09, 0x00000000, 36, 0 },
    { /*  30 */ 0x88888889, 0x00000000, 36, 0 }, { /*  31 */ 0x84210842, 0x84210842, 36, 0 },
    { /*  32 */ 0x08000000, 0x00000000, 32, 0 }, { /*  33 */ 0xF83E0F84, 0x00000000, 37, 0 },
    { /*  34 */ 0xF0F0F0F1, 0x00000000, 37, 0 }, { /*  35 */ 0xEA0EA0EA, 0xEA0EA0EA, 37, 0 },
    { /*  36 */ 0xE38E38E4, 0x00000000, 37, 0 }, { /*  37 */ 0xDD67C8A6, 0xDD67C8A6, 37, 0 },
    { /*  38 */ 0xD79435E5, 0xD79435E5, 37, 0 }, { /*  39 */ 0xD20D20D2, 0xD20D20D2, 37, 0 },
    { /*  40 */ 0xCCCCCCCD, 0x00000000, 37, 0 }, { /*  41 */ 0xC7CE0C7D, 0x00000000, 37, 0 },
    { /*  42 */ 0xC30C30C3, 0xC30C30C3, 37, 0 }, { /*  43 */ 0xBE82FA0C, 0x00000000, 37, 0 },
    { /*  44 */ 0xBA2E8BA3, 0x00000000, 37, 0 }, { /*  45 */ 0xB60B60B6, 0xB60B60B6, 37, 0 },
    { /*  46 */ 0xB21642C9, 0x00000000, 37, 0 }, { /*  47 */ 0xAE4C415D, 0x00000000, 37, 0 },
    { /*  48 */ 0xAAAAAAAB, 0x00000000, 37, 0 }, { /*  49 */ 0xA72F053A, 0x00000000, 37, 0 },
    { /*  50 */ 0xA3D70A3E, 0x00000000, 37, 0 }, { /*  51 */ 0xA0A0A0A1, 0x00000000, 37, 0 },
    { /*  52 */ 0x9D89D89E, 0x00000000, 37, 0 }, { /*  53 */ 0x9A90E7D9, 0x9A90E7D9, 37, 0 },
    { /*  54 */ 0x97B425ED, 0x97B425ED, 37, 0 }, { /*  55 */ 0x94F2094F, 0x94F2094F, 37, 0 },
    { /*  56 */ 0x92492492, 0x92492492, 37, 0 }, { /*  57 */ 0x8FB823EE, 0x8FB823EE, 37, 0 },
    { /*  58 */ 0x8D3DCB09, 0x00000000, 37, 0 }, { /*  59 */ 0x8AD8F2FC, 0x00000000, 37, 0 },
    { /*  60 */ 0x88888889, 0x00000000, 37, 0 }, { /*  61 */ 0x864B8A7E, 0x00000000, 37, 0 },
    { /*  62 */ 0x84210842, 0x84210842, 37, 0 }, { /*  63 */ 0x82082082, 0x82082082, 37, 0 },
    { /*  64 */ 0x04000000, 0x00000000, 32, 0 }, { /*  65 */ 0xFC0FC0FD, 0x00000000, 38, 0 },
    { /*  66 */ 0xF83E0F84, 0x00000000, 38, 0 }, { /*  67 */ 0xF4898D60, 0x00000000, 38, 0 },
    { /*  68 */ 0xF0F0F0F1, 0x00000000, 38, 0 }, { /*  69 */ 0xED7303B6, 0x00000000, 38, 0 },
    { /*  70 */ 0xEA0EA0EA, 0xEA0EA0EA, 38, 0 }, { /*  71 */ 0xE6C2B449, 0x00000000, 38, 0 },
    { /*  72 */ 0xE38E38E4, 0x00000000, 38, 0 }, { /*  73 */ 0xE070381C, 0xE070381C, 38, 0 },
    { /*  74 */ 0xDD67C8A6, 0xDD67C8A6, 38, 0 }, { /*  75 */ 0xDA740DA8, 0x00000000, 38, 0 },
    { /*  76 */ 0xD79435E5, 0xD79435E5, 38, 0 }, { /*  77 */ 0xD4C77B04, 0x00000000, 38, 0 },
    { /*  78 */ 0xD20D20D2, 0xD20D20D2, 38, 0 }, { /*  79 */ 0xCF6474A9, 0x00000000, 38, 0 },
    { /*  80 */ 0xCCCCCCCD, 0x00000000, 38, 0 }, { /*  81 */ 0xCA4587E7, 0x00000000, 38, 0 },
    { /*  82 */ 0xC7CE0C7D, 0x00000000, 38, 0 }, { /*  83 */ 0xC565C87C, 0x00000000, 38, 0 },
    { /*  84 */ 0xC30C30C3, 0xC30C30C3, 38, 0 }, { /*  85 */ 0xC0C0C0C1, 0x00000000, 38, 0 },
    { /*  86 */ 0xBE82FA0C, 0x00000000, 38, 0 }, { /*  87 */ 0xBC52640C, 0x00000000, 38, 0 },
    { /*  88 */ 0xBA2E8BA3, 0x00000000, 38, 0 }, { /*  89 */ 0xB81702E1, 0x00000000, 38, 0 },
    { /*  90 */ 0xB60B60B6, 0xB60B60B6, 38, 0 }, { /*  91 */ 0xB40B40B4, 0xB40B40B4, 38, 0 },
    { /*  92 */ 0xB21642C9, 0x00000000, 38, 0 }, { /*  93 */ 0xB02C0B03, 0x00000000, 38, 0 },
    { /*  94 */ 0xAE4C415D, 0x00000000, 38, 0 }, { /*  95 */ 0xAC769184, 0xAC769184, 38, 0 },
    { /*  96 */ 0xAAAAAAAB, 0x00000000, 38, 0 }, { /*  97 */ 0xA8E83F57, 0xA8E83F57, 38, 0 },
    { /*  98 */ 0xA72F053A, 0x00000000, 38, 0 }, { /*  99 */ 0xA57EB503, 0x00000000, 38, 0 },
    { /* 100 */ 0xA3D70A3E, 0x00000000, 38, 0 }, { /* 101 */ 0xA237C32B, 0xA237C32B, 38, 0 },
    { /* 102 */ 0xA0A0A0A1, 0x00000000, 38, 0 }, { /* 103 */ 0x9F1165E7, 0x9F1165E7, 38, 0 },
    { /* 104 */ 0x9D89D89E, 0x00000000, 38, 0 }, { /* 105 */ 0x9C09C09C, 0x9C09C09C, 38, 0 },
    { /* 106 */ 0x9A90E7D9, 0x9A90E7D9, 38, 0 }, { /* 107 */ 0x991F1A51, 0x991F1A51, 38, 0 },
    { /* 108 */ 0x97B425ED, 0x97B425ED, 38, 0 }, { /* 109 */ 0x964FDA6C, 0x964FDA6C, 38, 0 },
    { /* 110 */ 0x94F2094F, 0x94F2094F, 38, 0 }, { /* 111 */ 0x939A85C4, 0x939A85C4, 38, 0 },
    { /* 112 */ 0x92492492, 0x92492492, 38, 0 }, { /* 113 */ 0x90FDBC09, 0x90FDBC09, 38, 0 },
    { /* 114 */ 0x8FB823EE, 0x8FB823EE, 38, 0 }, { /* 115 */ 0x8E78356D, 0x8E78356D, 38, 0 },
    { /* 116 */ 0x8D3DCB09, 0x00000000, 38, 0 }, { /* 117 */ 0x8C08C08C, 0x8C08C08C, 38, 0 },
    { /* 118 */ 0x8AD8F2FC, 0x00000000, 38, 0 }, { /* 119 */ 0x89AE408A, 0x00000000, 38, 0 },
    { /* 120 */ 0x88888889, 0x00000000, 38, 0 }, { /* 121 */ 0x8767AB5F, 0x8767AB5F, 38, 0 },
    { /* 122 */ 0x864B8A7E, 0x00000000, 38, 0 }, { /* 123 */ 0x85340853, 0x85340853, 38, 0 },
    { /* 124 */ 0x84210842, 0x84210842, 38, 0 }, { /* 125 */ 0x83126E98, 0x00000000, 38, 0 },
    { /* 126 */ 0x82082082, 0x82082082, 38, 0 }, { /* 127 */ 0x81020408, 0x81020408, 38, 0 },
    { /* 128 */ 0x02000000, 0x00000000, 32, 0 }, { /* 129 */ 0xFE03F810, 0x00000000, 39, 0 },
    { /* 130 */ 0xFC0FC0FD, 0x00000000, 39, 0 }, { /* 131 */ 0xFA232CF3, 0x00000000, 39, 0 },
    { /* 132 */ 0xF83E0F84, 0x00000000, 39, 0 }, { /* 133 */ 0xF6603D99, 0x00000000, 39, 0 },
    { /* 134 */ 0xF4898D60, 0x00000000, 39, 0 }, { /* 135 */ 0xF2B9D649, 0x00000000, 39, 0 },
    { /* 136 */ 0xF0F0F0F1, 0x00000000, 39, 0 }, { /* 137 */ 0xEF2EB720, 0x00000000, 39, 0 },
    { /* 138 */ 0xED7303B6, 0x00000000, 39, 0 }, { /* 139 */ 0xEBBDB2A6, 0x00000000, 39, 0 },
    { /* 140 */ 0xEA0EA0EA, 0xEA0EA0EA, 39, 0 }, { /* 141 */ 0xE865AC7C, 0x00000000, 39, 0 },
    { /* 142 */ 0xE6C2B449, 0x00000000, 39, 0 }, { /* 143 */ 0xE525982B, 0x00000000, 39, 0 },
    { /* 144 */ 0xE38E38E4, 0x00000000, 39, 0 }, { /* 145 */ 0xE1FC780F, 0x00000000, 39, 0 },
    { /* 146 */ 0xE070381C, 0xE070381C, 39, 0 }, { /* 147 */ 0xDEE95C4D, 0x00000000, 39, 0 },
    { /* 148 */ 0xDD67C8A6, 0xDD67C8A6, 39, 0 }, { /* 149 */ 0xDBEB61EF, 0x00000000, 39, 0 },
    { /* 150 */ 0xDA740DA8, 0x00000000, 39, 0 }, { /* 151 */ 0xD901B204, 0x00000000, 39, 0 },
    { /* 152 */ 0xD79435E5, 0xD79435E5, 39, 0 }, { /* 153 */ 0xD62B80D7, 0x00000000, 39, 0 },
    { /* 154 */ 0xD4C77B04, 0x00000000, 39, 0 }, { /* 155 */ 0xD3680D37, 0x00000000, 39, 0 },
    { /* 156 */ 0xD20D20D2, 0xD20D20D2, 39, 0 }, { /* 157 */ 0xD0B69FCC, 0x00000000, 39, 0 },
    { /* 158 */ 0xCF6474A9, 0x00000000, 39, 0 }, { /* 159 */ 0xCE168A77, 0xCE168A77, 39, 0 },
    { /* 160 */ 0xCCCCCCCD, 0x00000000, 39, 0 }, { /* 161 */ 0xCB8727C1, 0x00000000, 39, 0 },
    { /* 162 */ 0xCA4587E7, 0x00000000, 39, 0 }, { /* 163 */ 0xC907DA4F, 0x00000000, 39, 0 },
    { /* 164 */ 0xC7CE0C7D, 0x00000000, 39, 0 }, { /* 165 */ 0xC6980C6A, 0x00000000, 39, 0 },
    { /* 166 */ 0xC565C87C, 0x00000000, 39, 0 }, { /* 167 */ 0xC4372F86, 0x00000000, 39, 0 },
    { /* 168 */ 0xC30C30C3, 0xC30C30C3, 39, 0 }, { /* 169 */ 0xC1E4BBD6, 0x00000000, 39, 0 },
    { /* 170 */ 0xC0C0C0C1, 0x00000000, 39, 0 }, { /* 171 */ 0xBFA02FE8, 0xBFA02FE8, 39, 0 },
    { /* 172 */ 0xBE82FA0C, 0x00000000, 39, 0 }, { /* 173 */ 0xBD691047, 0xBD691047, 39, 0 },
    { /* 174 */ 0xBC52640C, 0x00000000, 39, 0 }, { /* 175 */ 0xBB3EE722, 0x00000000, 39, 0 },
    { /* 176 */ 0xBA2E8BA3, 0x00000000, 39, 0 }, { /* 177 */ 0xB92143FA, 0xB92143FA, 39, 0 },
    { /* 178 */ 0xB81702E1, 0x00000000, 39, 0 }, { /* 179 */ 0xB70FBB5A, 0xB70FBB5A, 39, 0 },
    { /* 180 */ 0xB60B60B6, 0xB60B60B6, 39, 0 }, { /* 181 */ 0xB509E68B, 0x00000000, 39, 0 },
    { /* 182 */ 0xB40B40B4, 0xB40B40B4, 39, 0 }, { /* 183 */ 0xB30F6353, 0x00000000, 39, 0 },
    { /* 184 */ 0xB21642C9, 0x00000000, 39, 0 }, { /* 185 */ 0xB11FD3B8, 0xB11FD3B8, 39, 0 },
    { /* 186 */ 0xB02C0B03, 0x00000000, 39, 0 }, { /* 187 */ 0xAF3ADDC7, 0x00000000, 39, 0 },
    { /* 188 */ 0xAE4C415D, 0x00000000, 39, 0 }, { /* 189 */ 0xAD602B58, 0xAD602B58, 39, 0 },
    { /* 190 */ 0xAC769184, 0xAC769184, 39, 0 }, { /* 191 */ 0xAB8F69E3, 0x00000000, 39, 0 },
    { /* 192 */ 0xAAAAAAAB, 0x00000000, 39, 0 }, { /* 193 */ 0xA9C84A48, 0x00000000, 39, 0 },
    { /* 194 */ 0xA8E83F57, 0xA8E83F57, 39, 0 }, { /* 195 */ 0xA80A80A8, 0xA80A80A8, 39, 0 },
    { /* 196 */ 0xA72F053A, 0x00000000, 39, 0 }, { /* 197 */ 0xA655C439, 0xA655C439, 39, 0 },
    { /* 198 */ 0xA57EB503, 0x00000000, 39, 0 }, { /* 199 */ 0xA4A9CF1E, 0x00000000, 39, 0 },
    { /* 200 */ 0xA3D70A3E, 0x00000000, 39, 0 }, { /* 201 */ 0xA3065E40, 0x00000000, 39, 0 },
    { /* 202 */ 0xA237C32B, 0xA237C32B, 39, 0 }, { /* 203 */ 0xA16B312F, 0x00000000, 39, 0 },
    { /* 204 */ 0xA0A0A0A1, 0x00000000, 39, 0 }, { /* 205 */ 0x9FD809FE, 0x00000000, 39, 0 },
    { /* 206 */ 0x9F1165E7, 0x9F1165E7, 39, 0 }, { /* 207 */ 0x9E4CAD24, 0x00000000, 39, 0 },
    { /* 208 */ 0x9D89D89E, 0x00000000, 39, 0 }, { /* 209 */ 0x9CC8E161, 0x00000000, 39, 0 },
    { /* 210 */ 0x9C09C09C, 0x9C09C09C, 39, 0 }, { /* 211 */ 0x9B4C6F9F, 0x00000000, 39, 0 },
    { /* 212 */ 0x9A90E7D9, 0x9A90E7D9, 39, 0 }, { /* 213 */ 0x99D722DB, 0x00000000, 39, 0 },
    { /* 214 */ 0x991F1A51, 0x991F1A51, 39, 0 }, { /* 215 */ 0x9868C80A, 0x00000000, 39, 0 },
    { /* 216 */ 0x97B425ED, 0x97B425ED, 39, 0 }, { /* 217 */ 0x97012E02, 0x97012E02, 39, 0 },
    { /* 218 */ 0x964FDA6C, 0x964FDA6C, 39, 0 }, { /* 219 */ 0x95A02568, 0x95A02568, 39, 0 },
    { /* 220 */ 0x94F2094F, 0x94F2094F, 39, 0 }, { /* 221 */ 0x94458094, 0x94458094, 39, 0 },
    { /* 222 */ 0x939A85C4, 0x939A85C4, 39, 0 }, { /* 223 */ 0x92F11384, 0x92F11384, 39, 0 },
    { /* 224 */ 0x92492492, 0x92492492, 39, 0 }, { /* 225 */ 0x91A2B3C5, 0x00000000, 39, 0 },
    { /* 226 */ 0x90FDBC09, 0x90FDBC09, 39, 0 }, { /* 227 */ 0x905A3863, 0x905A3863, 39, 0 },
    { /* 228 */ 0x8FB823EE, 0x8FB823EE, 39, 0 }, { /* 229 */ 0x8F1779DA, 0x00000000, 39, 0 },
    { /* 230 */ 0x8E78356D, 0x8E78356D, 39, 0 }, { /* 231 */ 0x8DDA5202, 0x8DDA5202, 39, 0 },
    { /* 232 */ 0x8D3DCB09, 0x00000000, 39, 0 }, { /* 233 */ 0x8CA29C04, 0x8CA29C04, 39, 0 },
    { /* 234 */ 0x8C08C08C, 0x8C08C08C, 39, 0 }, { /* 235 */ 0x8B70344A, 0x8B70344A, 39, 0 },
    { /* 236 */ 0x8AD8F2FC, 0x00000000, 39, 0 }, { /* 237 */ 0x8A42F870, 0x8A42F870, 39, 0 },
    { /* 238 */ 0x89AE408A, 0x00000000, 39, 0 }, { /* 239 */ 0x891AC73B, 0x00000000, 39, 0 },
    { /* 240 */ 0x88888889, 0x00000000, 39, 0 }, { /* 241 */ 0x87F78088, 0x00000000, 39, 0 },
    { /* 242 */ 0x8767AB5F, 0x8767AB5F, 39, 0 }, { /* 243 */ 0x86D90545, 0x00000000, 39, 0 },
    { /* 244 */ 0x864B8A7E, 0x00000000, 39, 0 }, { /* 245 */ 0x85BF3761, 0x85BF3761, 39, 0 },
    { /* 246 */ 0x85340853, 0x85340853, 39, 0 }, { /* 247 */ 0x84A9F9C8, 0x84A9F9C8, 39, 0 },
    { /* 248 */ 0x84210842, 0x84210842, 39, 0 }, { /* 249 */ 0x83993052, 0x83993052, 39, 0 },
    { /* 250 */ 0x83126E98, 0x00000000, 39, 0 }, { /* 251 */ 0x828CBFBF, 0x00000000, 39, 0 },
    { /* 252 */ 0x82082082, 0x82082082, 39, 0 }, { /* 253 */ 0x81848DA9, 0x00000000, 39, 0 },
    { /* 254 */ 0x81020408, 0x81020408, 39, 0 }, { /* 255 */ 0x80808081, 0x00000000, 39, 0 },
    { /* 256 */ 0x01000000, 0x00000000, 32, 0 }, { /* 257 */ 0xFF00FF01, 0x00000000, 40, 0 },
    { /* 258 */ 0xFE03F810, 0x00000000, 40, 0 }, { /* 259 */ 0xFD08E551, 0x00000000, 40, 0 },
    { /* 260 */ 0xFC0FC0FD, 0x00000000, 40, 0 }, { /* 261 */ 0xFB188566, 0x00000000, 40, 0 },
    { /* 262 */ 0xFA232CF3, 0x00000000, 40, 0 }, { /* 263 */ 0xF92FB222, 0x00000000, 40, 0 },
    { /* 264 */ 0xF83E0F84, 0x00000000, 40, 0 }, { /* 265 */ 0xF74E3FC3, 0x00000000, 40, 0 },
    { /* 266 */ 0xF6603D99, 0x00000000, 40, 0 }, { /* 267 */ 0xF57403D6, 0x00000000, 40, 0 },
    { /* 268 */ 0xF4898D60, 0x00000000, 40, 0 }, { /* 269 */ 0xF3A0D52D, 0x00000000, 40, 0 },
    { /* 270 */ 0xF2B9D649, 0x00000000, 40, 0 }, { /* 271 */ 0xF1D48BCF, 0x00000000, 40, 0 },
    { /* 272 */ 0xF0F0F0F1, 0x00000000, 40, 0 }, { /* 273 */ 0xF00F00F0, 0xF00F00F0, 40, 0 },
    { /* 274 */ 0xEF2EB720, 0x00000000, 40, 0 }, { /* 275 */ 0xEE500EE5, 0xEE500EE5, 40, 0 },
    { /* 276 */ 0xED7303B6, 0x00000000, 40, 0 }, { /* 277 */ 0xEC979119, 0x00000000, 40, 0 },
    { /* 278 */ 0xEBBDB2A6, 0x00000000, 40, 0 }, { /* 279 */ 0xEAE56404, 0x00000000, 40, 0 },
    { /* 280 */ 0xEA0EA0EA, 0xEA0EA0EA, 40, 0 }, { /* 281 */ 0xE9396520, 0x00000000, 40, 0 },
    { /* 282 */ 0xE865AC7C, 0x00000000, 40, 0 }, { /* 283 */ 0xE79372E3, 0x00000000, 40, 0 },
    { /* 284 */ 0xE6C2B449, 0x00000000, 40, 0 }, { /* 285 */ 0xE5F36CB0, 0xE5F36CB0, 40, 0 },
    { /* 286 */ 0xE525982B, 0x00000000, 40, 0 }, { /* 287 */ 0xE45932D8, 0x00000000, 40, 0 },
    { /* 288 */ 0xE38E38E4, 0x00000000, 40, 0 }, { /* 289 */ 0xE2C4A689, 0x00000000, 40, 0 },
    { /* 290 */ 0xE1FC780F, 0x00000000, 40, 0 }, { /* 291 */ 0xE135A9CA, 0x00000000, 40, 0 },
    { /* 292 */ 0xE070381C, 0xE070381C, 40, 0 }, { /* 293 */ 0xDFAC1F75, 0x00000000, 40, 0 },
    { /* 294 */ 0xDEE95C4D, 0x00000000, 40, 0 }, { /* 295 */ 0xDE27EB2D, 0x00000000, 40, 0 },
    { /* 296 */ 0xDD67C8A6, 0xDD67C8A6, 40, 0 }, { /* 297 */ 0xDCA8F159, 0x00000000, 40, 0 },
    { /* 298 */ 0xDBEB61EF, 0x00000000, 40, 0 }, { /* 299 */ 0xDB2F171E, 0x00000000, 40, 0 },
    { /* 300 */ 0xDA740DA8, 0x00000000, 40, 0 }, { /* 301 */ 0xD9BA4257, 0x00000000, 40, 0 },
    { /* 302 */ 0xD901B204, 0x00000000, 40, 0 }, { /* 303 */ 0xD84A598F, 0x00000000, 40, 0 },
    { /* 304 */ 0xD79435E5, 0xD79435E5, 40, 0 }, { /* 305 */ 0xD6DF43FD, 0x00000000, 40, 0 },
    { /* 306 */ 0xD62B80D7, 0x00000000, 40, 0 }, { /* 307 */ 0xD578E97D, 0x00000000, 40, 0 },
    { /* 308 */ 0xD4C77B04, 0x00000000, 40, 0 }, { /* 309 */ 0xD417328A, 0x00000000, 40, 0 },
    { /* 310 */ 0xD3680D37, 0x00000000, 40, 0 }, { /* 311 */ 0xD2BA083C, 0x00000000, 40, 0 },
    { /* 312 */ 0xD20D20D2, 0xD20D20D2, 40, 0 }, { /* 313 */ 0xD161543E, 0xD161543E, 40, 0 },
    { /* 314 */ 0xD0B69FCC, 0x00000000, 40, 0 }, { /* 315 */ 0xD00D00D0, 0xD00D00D0, 40, 0 },
    { /* 316 */ 0xCF6474A9, 0x00000000, 40, 0 }, { /* 317 */ 0xCEBCF8BC, 0x00000000, 40, 0 },
    { /* 318 */ 0xCE168A77, 0xCE168A77, 40, 0 }, { /* 319 */ 0xCD712753, 0x00000000, 40, 0 },
    { /* 320 */ 0xCCCCCCCD, 0x00000000, 40, 0 }, { /* 321 */ 0xCC29786D, 0x00000000, 40, 0 },
    { /* 322 */ 0xCB8727C1, 0x00000000, 40, 0 }, { /* 323 */ 0xCAE5D85F, 0xCAE5D85F, 40, 0 },
    { /* 324 */ 0xCA4587E7, 0x00000000, 40, 0 }, { /* 325 */ 0xC9A633FD, 0x00000000, 40, 0 },
    { /* 326 */ 0xC907DA4F, 0x00000000, 40, 0 }, { /* 327 */ 0xC86A7890, 0xC86A7890, 40, 0 },
    { /* 328 */ 0xC7CE0C7D, 0x00000000, 40, 0 }, { /* 329 */ 0xC73293D8, 0x00000000, 40, 0 },
    { /* 330 */ 0xC6980C6A, 0x00000000, 40, 0 }, { /* 331 */ 0xC5FE7403, 0xC5FE7403, 40, 0 },
    { /* 332 */ 0xC565C87C, 0x00000000, 40, 0 }, { /* 333 */ 0xC4CE07B0, 0xC4CE07B0, 40, 0 },
    { /* 334 */ 0xC4372F86, 0x00000000, 40, 0 }, { /* 335 */ 0xC3A13DE6, 0xC3A13DE6, 40, 0 },
    { /* 336 */ 0xC30C30C3, 0xC30C30C3, 40, 0 }, { /* 337 */ 0xC2780614, 0x00000000, 40, 0 },
    { /* 338 */ 0xC1E4BBD6, 0x00000000, 40, 0 }, { /* 339 */ 0xC152500C, 0xC152500C, 40, 0 },
    { /* 340 */ 0xC0C0C0C1, 0x00000000, 40, 0 }, { /* 341 */ 0xC0300C03, 0xC0300C03, 40, 0 },
    { /* 342 */ 0xBFA02FE8, 0xBFA02FE8, 40, 0 }, { /* 343 */ 0xBF112A8B, 0x00000000, 40, 0 },
    { /* 344 */ 0xBE82FA0C, 0x00000000, 40, 0 }, { /* 345 */ 0xBDF59C92, 0x00000000, 40, 0 },
    { /* 346 */ 0xBD691047, 0xBD691047, 40, 0 }, { /* 347 */ 0xBCDD535E, 0x00000000, 40, 0 },
    { /* 348 */ 0xBC52640C, 0x00000000, 40, 0 }, { /* 349 */ 0xBBC8408D, 0x00000000, 40, 0 },
    { /* 350 */ 0xBB3EE722, 0x00000000, 40, 0 }, { /* 351 */ 0xBAB65610, 0xBAB65610, 40, 0 },
    { /* 352 */ 0xBA2E8BA3, 0x00000000, 40, 0 }, { /* 353 */ 0xB9A7862A, 0xB9A7862A, 40, 0 },
    { /* 354 */ 0xB92143FA, 0xB92143FA, 40, 0 }, { /* 355 */ 0xB89BC36D, 0x00000000, 40, 0 },
    { /* 356 */ 0xB81702E1, 0x00000000, 40, 0 }, { /* 357 */ 0xB79300B8, 0x00000000, 40, 0 },
    { /* 358 */ 0xB70FBB5A, 0xB70FBB5A, 40, 0 }, { /* 359 */ 0xB68D3134, 0xB68D3134, 40, 0 },
    { /* 360 */ 0xB60B60B6, 0xB60B60B6, 40, 0 }, { /* 361 */ 0xB58A4855, 0xB58A4855, 40, 0 },
    { /* 362 */ 0xB509E68B, 0x00000000, 40, 0 }, { /* 363 */ 0xB48A39D4, 0xB48A39D4, 40, 0 },
    { /* 364 */ 0xB40B40B4, 0xB40B40B4, 40, 0 }, { /* 365 */ 0xB38CF9B0, 0xB38CF9B0, 40, 0 },
    { /* 366 */ 0xB30F6353, 0x00000000, 40, 0 }, { /* 367 */ 0xB2927C2A, 0x00000000, 40, 0 },
    { /* 368 */ 0xB21642C9, 0x00000000, 40, 0 }, { /* 369 */ 0xB19AB5C5, 0x00000000, 40, 0 },
    { /* 370 */ 0xB11FD3B8, 0xB11FD3B8, 40, 0 }, { /* 371 */ 0xB0A59B42, 0x00000000, 40, 0 },
    { /* 372 */ 0xB02C0B03, 0x00000000, 40, 0 }, { /* 373 */ 0xAFB321A1, 0xAFB321A1, 40, 0 },
    { /* 374 */ 0xAF3ADDC7, 0x00000000, 40, 0 }, { /* 375 */ 0xAEC33E20, 0x00000000, 40, 0 },
    { /* 376 */ 0xAE4C415D, 0x00000000, 40, 0 }, { /* 377 */ 0xADD5E632, 0xADD5E632, 40, 0 },
    { /* 378 */ 0xAD602B58, 0xAD602B58, 40, 0 }, { /* 379 */ 0xACEB0F89, 0xACEB0F89, 40, 0 },
    { /* 380 */ 0xAC769184, 0xAC769184, 40, 0 }, { /* 381 */ 0xAC02B00B, 0x00000000, 40, 0 },
    { /* 382 */ 0xAB8F69E3, 0x00000000, 40, 0 }, { /* 383 */ 0xAB1CBDD4, 0x00000000, 40, 0 },
    { /* 384 */ 0xAAAAAAAB, 0x00000000, 40, 0 }, { /* 385 */ 0xAA392F36, 0x00000000, 40, 0 },
    { /* 386 */ 0xA9C84A48, 0x00000000, 40, 0 }, { /* 387 */ 0xA957FAB5, 0xA957FAB5, 40, 0 },
    { /* 388 */ 0xA8E83F57, 0xA8E83F57, 40, 0 }, { /* 389 */ 0xA8791709, 0x00000000, 40, 0 },
    { /* 390 */ 0xA80A80A8, 0xA80A80A8, 40, 0 }, { /* 391 */ 0xA79C7B17, 0x00000000, 40, 0 },
    { /* 392 */ 0xA72F053A, 0x00000000, 40, 0 }, { /* 393 */ 0xA6C21DF7, 0x00000000, 40, 0 },
    { /* 394 */ 0xA655C439, 0xA655C439, 40, 0 }, { /* 395 */ 0xA5E9F6ED, 0xA5E9F6ED, 40, 0 },
    { /* 396 */ 0xA57EB503, 0x00000000, 40, 0 }, { /* 397 */ 0xA513FD6C, 0x00000000, 40, 0 },
    { /* 398 */ 0xA4A9CF1E, 0x00000000, 40, 0 }, { /* 399 */ 0xA4402910, 0xA4402910, 40, 0 },
    { /* 400 */ 0xA3D70A3E, 0x00000000, 40, 0 }, { /* 401 */ 0xA36E71A3, 0x00000000, 40, 0 },
    { /* 402 */ 0xA3065E40, 0x00000000, 40, 0 }, { /* 403 */ 0xA29ECF16, 0xA29ECF16, 40, 0 },
    { /* 404 */ 0xA237C32B, 0xA237C32B, 40, 0 }, { /* 405 */ 0xA1D13986, 0x00000000, 40, 0 },
    { /* 406 */ 0xA16B312F, 0x00000000, 40, 0 }, { /* 407 */ 0xA105A933, 0x00000000, 40, 0 },
    { /* 408 */ 0xA0A0A0A1, 0x00000000, 40, 0 }, { /* 409 */ 0xA03C1689, 0x00000000, 40, 0 },
    { /* 410 */ 0x9FD809FE, 0x00000000, 40, 0 }, { /* 411 */ 0x9F747A15, 0x9F747A15, 40, 0 },
    { /* 412 */ 0x9F1165E7, 0x9F1165E7, 40, 0 }, { /* 413 */ 0x9EAECC8D, 0x9EAECC8D, 40, 0 },
    { /* 414 */ 0x9E4CAD24, 0x00000000, 40, 0 }, { /* 415 */ 0x9DEB06C9, 0x9DEB06C9, 40, 0 },
    { /* 416 */ 0x9D89D89E, 0x00000000, 40, 0 }, { /* 417 */ 0x9D2921C4, 0x00000000, 40, 0 },
    { /* 418 */ 0x9CC8E161, 0x00000000, 40, 0 }, { /* 419 */ 0x9C69169B, 0x9C69169B, 40, 0 },
    { /* 420 */ 0x9C09C09C, 0x9C09C09C, 40, 0 }, { /* 421 */ 0x9BAADE8E, 0x9BAADE8E, 40, 0 },
    { /* 422 */ 0x9B4C6F9F, 0x00000000, 40, 0 }, { /* 423 */ 0x9AEE72FD, 0x00000000, 40, 0 },
    { /* 424 */ 0x9A90E7D9, 0x9A90E7D9, 40, 0 }, { /* 425 */ 0x9A33CD67, 0x9A33CD67, 40, 0 },
    { /* 426 */ 0x99D722DB, 0x00000000, 40, 0 }, { /* 427 */ 0x997AE76B, 0x997AE76B, 40, 0 },
    { /* 428 */ 0x991F1A51, 0x991F1A51, 40, 0 }, { /* 429 */ 0x98C3BAC7, 0x98C3BAC7, 40, 0 },
    { /* 430 */ 0x9868C80A, 0x00000000, 40, 0 }, { /* 431 */ 0x980E4156, 0x980E4156, 40, 0 },
    { /* 432 */ 0x97B425ED, 0x97B425ED, 40, 0 }, { /* 433 */ 0x975A7510, 0x00000000, 40, 0 },
    { /* 434 */ 0x97012E02, 0x97012E02, 40, 0 }, { /* 435 */ 0x96A8500A, 0x00000000, 40, 0 },
    { /* 436 */ 0x964FDA6C, 0x964FDA6C, 40, 0 }, { /* 437 */ 0x95F7CC73, 0x00000000, 40, 0 },
    { /* 438 */ 0x95A02568, 0x95A02568, 40, 0 }, { /* 439 */ 0x9548E498, 0x00000000, 40, 0 },
    { /* 440 */ 0x94F2094F, 0x94F2094F, 40, 0 }, { /* 441 */ 0x949B92DE, 0x00000000, 40, 0 },
    { /* 442 */ 0x94458094, 0x94458094, 40, 0 }, { /* 443 */ 0x93EFD1C5, 0x93EFD1C5, 40, 0 },
    { /* 444 */ 0x939A85C4, 0x939A85C4, 40, 0 }, { /* 445 */ 0x93459BE7, 0x00000000, 40, 0 },
    { /* 446 */ 0x92F11384, 0x92F11384, 40, 0 }, { /* 447 */ 0x929CEBF5, 0x00000000, 40, 0 },
    { /* 448 */ 0x92492492, 0x92492492, 40, 0 }, { /* 449 */ 0x91F5BCB9, 0x00000000, 40, 0 },
    { /* 450 */ 0x91A2B3C5, 0x00000000, 40, 0 }, { /* 451 */ 0x91500915, 0x91500915, 40, 0 },
    { /* 452 */ 0x90FDBC09, 0x90FDBC09, 40, 0 }, { /* 453 */ 0x90ABCC02, 0x90ABCC02, 40, 0 },
    { /* 454 */ 0x905A3863, 0x905A3863, 40, 0 }, { /* 455 */ 0x90090090, 0x90090090, 40, 0 },
    { /* 456 */ 0x8FB823EE, 0x8FB823EE, 40, 0 }, { /* 457 */ 0x8F67A1E4, 0x00000000, 40, 0 },
    { /* 458 */ 0x8F1779DA, 0x00000000, 40, 0 }, { /* 459 */ 0x8EC7AB3A, 0x00000000, 40, 0 },
    { /* 460 */ 0x8E78356D, 0x8E78356D, 40, 0 }, { /* 461 */ 0x8E2917E1, 0x00000000, 40, 0 },
    { /* 462 */ 0x8DDA5202, 0x8DDA5202, 40, 0 }, { /* 463 */ 0x8D8BE340, 0x00000000, 40, 0 },
    { /* 464 */ 0x8D3DCB09, 0x00000000, 40, 0 }, { /* 465 */ 0x8CF008CF, 0x8CF008CF, 40, 0 },
    { /* 466 */ 0x8CA29C04, 0x8CA29C04, 40, 0 }, { /* 467 */ 0x8C55841D, 0x00000000, 40, 0 },
    { /* 468 */ 0x8C08C08C, 0x8C08C08C, 40, 0 }, { /* 469 */ 0x8BBC50C9, 0x00000000, 40, 0 },
    { /* 470 */ 0x8B70344A, 0x8B70344A, 40, 0 }, { /* 471 */ 0x8B246A88, 0x00000000, 40, 0 },
    { /* 472 */ 0x8AD8F2FC, 0x00000000, 40, 0 }, { /* 473 */ 0x8A8DCD20, 0x00000000, 40, 0 },
    { /* 474 */ 0x8A42F870, 0x8A42F870, 40, 0 }, { /* 475 */ 0x89F8746A, 0x00000000, 40, 0 },
    { /* 476 */ 0x89AE408A, 0x00000000, 40, 0 }, { /* 477 */ 0x89645C4F, 0x89645C4F, 40, 0 },
    { /* 478 */ 0x891AC73B, 0x00000000, 40, 0 }, { /* 479 */ 0x88D180CD, 0x88D180CD, 40, 0 },
    { /* 480 */ 0x88888889, 0x00000000, 40, 0 }, { /* 481 */ 0x883FDDF0, 0x883FDDF0, 40, 0 },
    { /* 482 */ 0x87F78088, 0x00000000, 40, 0 }, { /* 483 */ 0x87AF6FD6, 0x00000000, 40, 0 },
    { /* 484 */ 0x8767AB5F, 0x8767AB5F, 40, 0 }, { /* 485 */ 0x872032AC, 0x872032AC, 40, 0 },
    { /* 486 */ 0x86D90545, 0x00000000, 40, 0 }, { /* 487 */ 0x869222B2, 0x00000000, 40, 0 },
    { /* 488 */ 0x864B8A7E, 0x00000000, 40, 0 }, { /* 489 */ 0x86053C34, 0x86053C34, 40, 0 },
    { /* 490 */ 0x85BF3761, 0x85BF3761, 40, 0 }, { /* 491 */ 0x85797B91, 0x85797B91, 40, 0 },
    { /* 492 */ 0x85340853, 0x85340853, 40, 0 }, { /* 493 */ 0x84EEDD36, 0x00000000, 40, 0 },
    { /* 494 */ 0x84A9F9C8, 0x84A9F9C8, 40, 0 }, { /* 495 */ 0x84655D9C, 0x00000000, 40, 0 },
    { /* 496 */ 0x84210842, 0x84210842, 40, 0 }, { /* 497 */ 0x83DCF94E, 0x00000000, 40, 0 },
    { /* 498 */ 0x83993052, 0x83993052, 40, 0 }, { /* 499 */ 0x8355ACE4, 0x00000000, 40, 0 },
    { /* 500 */ 0x83126E98, 0x00000000, 40, 0 }, { /* 501 */ 0x82CF7504, 0x00000000, 40, 0 },
    { /* 502 */ 0x828CBFBF, 0x00000000, 40, 0 }, { /* 503 */ 0x824A4E61, 0x00000000, 40, 0 },
    { /* 504 */ 0x82082082, 0x82082082, 40, 0 }, { /* 505 */ 0x81C635BC, 0x81C635BC, 40, 0 },
    { /* 506 */ 0x81848DA9, 0x00000000, 40, 0 }, { /* 507 */ 0x814327E4, 0x00000000, 40, 0 },
    { /* 508 */ 0x81020408, 0x81020408, 40, 0 }, { /* 509 */ 0x80C121B3, 0x00000000, 40, 0 },
    { /* 510 */ 0x80808081, 0x00000000, 40, 0 }, { /* 511 */ 0x80402010, 0x80402010, 40, 0 },
};

static const DivRatio64 div_ratio_tbl64[kMaxDivTable] = {
    { /*   0 */ 0x0000000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /*   1 */ 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull,  0, 0 },
    { /*   2 */ 0x8000000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /*   3 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  1, 0 },
    { /*   4 */ 0x4000000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /*   5 */ 0xCCCCCCCCCCCCCCCDull, 0x0000000000000000ull,  2, 0 },
    { /*   6 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  2, 0 },
    { /*   7 */ 0x9249249249249249ull, 0x9249249249249249ull,  2, 0 },
    { /*   8 */ 0x2000000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /*   9 */ 0xE38E38E38E38E38Full, 0x0000000000000000ull,  3, 0 },
    { /*  10 */ 0xCCCCCCCCCCCCCCCDull, 0x0000000000000000ull,  3, 0 },
    { /*  11 */ 0xBA2E8BA2E8BA2E8Cull, 0x0000000000000000ull,  3, 0 },
    { /*  12 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  3, 0 },
    { /*  13 */ 0x9D89D89D89D89D8Aull, 0x0000000000000000ull,  3, 0 },
    { /*  14 */ 0x9249249249249249ull, 0x9249249249249249ull,  3, 0 },
    { /*  15 */ 0x8888888888888889ull, 0x0000000000000000ull,  3, 0 },
    { /*  16 */ 0x1000000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /*  17 */ 0xF0F0F0F0F0F0F0F1ull, 0x0000000000000000ull,  4, 0 },
    { /*  18 */ 0xE38E38E38E38E38Full, 0x0000000000000000ull,  4, 0 },
    { /*  19 */ 0xD79435E50D79435Full, 0x0000000000000000ull,  4, 0 },
    { /*  20 */ 0xCCCCCCCCCCCCCCCDull, 0x0000000000000000ull,  4, 0 },
    { /*  21 */ 0xC30C30C30C30C30Cull, 0xC30C30C30C30C30Cull,  4, 0 },
    { /*  22 */ 0xBA2E8BA2E8BA2E8Cull, 0x0000000000000000ull,  4, 0 },
    { /*  23 */ 0xB21642C8590B2164ull, 0xB21642C8590B2164ull,  4, 0 },
    { /*  24 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  4, 0 },
    { /*  25 */ 0xA3D70A3D70A3D70Aull, 0xA3D70A3D70A3D70Aull,  4, 0 },
    { /*  26 */ 0x9D89D89D89D89D8Aull, 0x0000000000000000ull,  4, 0 },
    { /*  27 */ 0x97B425ED097B425Full, 0x0000000000000000ull,  4, 0 },
    { /*  28 */ 0x9249249249249249ull, 0x9249249249249249ull,  4, 0 },
    { /*  29 */ 0x8D3DCB08D3DCB08Dull, 0x8D3DCB08D3DCB08Dull,  4, 0 },
    { /*  30 */ 0x8888888888888889ull, 0x0000000000000000ull,  4, 0 },
    { /*  31 */ 0x8421084210842108ull, 0x8421084210842108ull,  4, 0 },
    { /*  32 */ 0x0800000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /*  33 */ 0xF83E0F83E0F83E10ull, 0x0000000000000000ull,  5, 0 },
    { /*  34 */ 0xF0F0F0F0F0F0F0F1ull, 0x0000000000000000ull,  5, 0 },
    { /*  35 */ 0xEA0EA0EA0EA0EA0Full, 0x0000000000000000ull,  5, 0 },
    { /*  36 */ 0xE38E38E38E38E38Full, 0x0000000000000000ull,  5, 0 },
    { /*  37 */ 0xDD67C8A60DD67C8Bull, 0x0000000000000000ull,  5, 0 },
    { /*  38 */ 0xD79435E50D79435Full, 0x0000000000000000ull,  5, 0 },
    { /*  39 */ 0xD20D20D20D20D20Dull, 0xD20D20D20D20D20Dull,  5, 0 },
    { /*  40 */ 0xCCCCCCCCCCCCCCCDull, 0x0000000000000000ull,  5, 0 },
    { /*  41 */ 0xC7CE0C7CE0C7CE0Dull, 0x0000000000000000ull,  5, 0 },
    { /*  42 */ 0xC30C30C30C30C30Cull, 0xC30C30C30C30C30Cull,  5, 0 },
    { /*  43 */ 0xBE82FA0BE82FA0BFull, 0x0000000000000000ull,  5, 0 },
    { /*  44 */ 0xBA2E8BA2E8BA2E8Cull, 0x0000000000000000ull,  5, 0 },
    { /*  45 */ 0xB60B60B60B60B60Cull, 0x0000000000000000ull,  5, 0 },
    { /*  46 */ 0xB21642C8590B2164ull, 0xB21642C8590B2164ull,  5, 0 },
    { /*  47 */ 0xAE4C415C9882B931ull, 0xAE4C415C9882B931ull,  5, 0 },
    { /*  48 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  5, 0 },
    { /*  49 */ 0xA72F05397829CBC1ull, 0xA72F05397829CBC1ull,  5, 0 },
    { /*  50 */ 0xA3D70A3D70A3D70Aull, 0xA3D70A3D70A3D70Aull,  5, 0 },
    { /*  51 */ 0xA0A0A0A0A0A0A0A1ull, 0x0000000000000000ull,  5, 0 },
    { /*  52 */ 0x9D89D89D89D89D8Aull, 0x0000000000000000ull,  5, 0 },
    { /*  53 */ 0x9A90E7D95BC609A9ull, 0x9A90E7D95BC609A9ull,  5, 0 },
    { /*  54 */ 0x97B425ED097B425Full, 0x0000000000000000ull,  5, 0 },
    { /*  55 */ 0x94F2094F2094F209ull, 0x94F2094F2094F209ull,  5, 0 },
    { /*  56 */ 0x9249249249249249ull, 0x9249249249249249ull,  5, 0 },
    { /*  57 */ 0x8FB823EE08FB823Full, 0x0000000000000000ull,  5, 0 },
    { /*  58 */ 0x8D3DCB08D3DCB08Dull, 0x8D3DCB08D3DCB08Dull,  5, 0 },
    { /*  59 */ 0x8AD8F2FBA9386823ull, 0x0000000000000000ull,  5, 0 },
    { /*  60 */ 0x8888888888888889ull, 0x0000000000000000ull,  5, 0 },
    { /*  61 */ 0x864B8A7DE6D1D608ull, 0x864B8A7DE6D1D608ull,  5, 0 },
    { /*  62 */ 0x8421084210842108ull, 0x8421084210842108ull,  5, 0 },
    { /*  63 */ 0x8208208208208208ull, 0x8208208208208208ull,  5, 0 },
    { /*  64 */ 0x0400000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /*  65 */ 0xFC0FC0FC0FC0FC10ull, 0x0000000000000000ull,  6, 0 },
    { /*  66 */ 0xF83E0F83E0F83E10ull, 0x0000000000000000ull,  6, 0 },
    { /*  67 */ 0xF4898D5F85BB3951ull, 0x0000000000000000ull,  6, 0 },
    { /*  68 */ 0xF0F0F0F0F0F0F0F1ull, 0x0000000000000000ull,  6, 0 },
    { /*  69 */ 0xED7303B5CC0ED731ull, 0x0000000000000000ull,  6, 0 },
    { /*  70 */ 0xEA0EA0EA0EA0EA0Full, 0x0000000000000000ull,  6, 0 },
    { /*  71 */ 0xE6C2B4481CD85689ull, 0xE6C2B4481CD85689ull,  6, 0 },
    { /*  72 */ 0xE38E38E38E38E38Full, 0x0000000000000000ull,  6, 0 },
    { /*  73 */ 0xE070381C0E070382ull, 0x0000000000000000ull,  6, 0 },
    { /*  74 */ 0xDD67C8A60DD67C8Bull, 0x0000000000000000ull,  6, 0 },
    { /*  75 */ 0xDA740DA740DA740Eull, 0x0000000000000000ull,  6, 0 },
    { /*  76 */ 0xD79435E50D79435Full, 0x0000000000000000ull,  6, 0 },
    { /*  77 */ 0xD4C77B03531DEC0Eull, 0x0000000000000000ull,  6, 0 },
    { /*  78 */ 0xD20D20D20D20D20Dull, 0xD20D20D20D20D20Dull,  6, 0 },
    { /*  79 */ 0xCF6474A8819EC8EAull, 0x0000000000000000ull,  6, 0 },
    { /*  80 */ 0xCCCCCCCCCCCCCCCDull, 0x0000000000000000ull,  6, 0 },
    { /*  81 */ 0xCA4587E6B74F0329ull, 0xCA4587E6B74F0329ull,  6, 0 },
    { /*  82 */ 0xC7CE0C7CE0C7CE0Dull, 0x0000000000000000ull,  6, 0 },
    { /*  83 */ 0xC565C87B5F9D4D1Cull, 0x0000000000000000ull,  6, 0 },
    { /*  84 */ 0xC30C30C30C30C30Cull, 0xC30C30C30C30C30Cull,  6, 0 },
    { /*  85 */ 0xC0C0C0C0C0C0C0C1ull, 0x0000000000000000ull,  6, 0 },
    { /*  86 */ 0xBE82FA0BE82FA0BFull, 0x0000000000000000ull,  6, 0 },
    { /*  87 */ 0xBC52640BC52640BDull, 0x0000000000000000ull,  6, 0 },
    { /*  88 */ 0xBA2E8BA2E8BA2E8Cull, 0x0000000000000000ull,  6, 0 },
    { /*  89 */ 0xB81702E05C0B8170ull, 0xB81702E05C0B8170ull,  6, 0 },
    { /*  90 */ 0xB60B60B60B60B60Cull, 0x0000000000000000ull,  6, 0 },
    { /*  91 */ 0xB40B40B40B40B40Bull, 0xB40B40B40B40B40Bull,  6, 0 },
    { /*  92 */ 0xB21642C8590B2164ull, 0xB21642C8590B2164ull,  6, 0 },
    { /*  93 */ 0xB02C0B02C0B02C0Bull, 0xB02C0B02C0B02C0Bull,  6, 0 },
    { /*  94 */ 0xAE4C415C9882B931ull, 0xAE4C415C9882B931ull,  6, 0 },
    { /*  95 */ 0xAC7691840AC76918ull, 0xAC7691840AC76918ull,  6, 0 },
    { /*  96 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  6, 0 },
    { /*  97 */ 0xA8E83F5717C0A8E8ull, 0xA8E83F5717C0A8E8ull,  6, 0 },
    { /*  98 */ 0xA72F05397829CBC1ull, 0xA72F05397829CBC1ull,  6, 0 },
    { /*  99 */ 0xA57EB50295FAD40Aull, 0xA57EB50295FAD40Aull,  6, 0 },
    { /* 100 */ 0xA3D70A3D70A3D70Aull, 0xA3D70A3D70A3D70Aull,  6, 0 },
    { /* 101 */ 0xA237C32B16CFD772ull, 0xA237C32B16CFD772ull,  6, 0 },
    { /* 102 */ 0xA0A0A0A0A0A0A0A1ull, 0x0000000000000000ull,  6, 0 },
    { /* 103 */ 0x9F1165E7254813E2ull, 0x9F1165E7254813E2ull,  6, 0 },
    { /* 104 */ 0x9D89D89D89D89D8Aull, 0x0000000000000000ull,  6, 0 },
    { /* 105 */ 0x9C09C09C09C09C0Aull, 0x0000000000000000ull,  6, 0 },
    { /* 106 */ 0x9A90E7D95BC609A9ull, 0x9A90E7D95BC609A9ull,  6, 0 },
    { /* 107 */ 0x991F1A515885FB37ull, 0x991F1A515885FB37ull,  6, 0 },
    { /* 108 */ 0x97B425ED097B425Full, 0x0000000000000000ull,  6, 0 },
    { /* 109 */ 0x964FDA6C0964FDA7ull, 0x0000000000000000ull,  6, 0 },
    { /* 110 */ 0x94F2094F2094F209ull, 0x94F2094F2094F209ull,  6, 0 },
    { /* 111 */ 0x939A85C40939A85Cull, 0x939A85C40939A85Cull,  6, 0 },
    { /* 112 */ 0x9249249249249249ull, 0x9249249249249249ull,  6, 0 },
    { /* 113 */ 0x90FDBC090FDBC091ull, 0x0000000000000000ull,  6, 0 },
    { /* 114 */ 0x8FB823EE08FB823Full, 0x0000000000000000ull,  6, 0 },
    { /* 115 */ 0x8E78356D1408E783ull, 0x8E78356D1408E783ull,  6, 0 },
    { /* 116 */ 0x8D3DCB08D3DCB08Dull, 0x8D3DCB08D3DCB08Dull,  6, 0 },
    { /* 117 */ 0x8C08C08C08C08C09ull, 0x0000000000000000ull,  6, 0 },
    { /* 118 */ 0x8AD8F2FBA9386823ull, 0x0000000000000000ull,  6, 0 },
    { /* 119 */ 0x89AE4089AE4089AEull, 0x89AE4089AE4089AEull,  6, 0 },
    { /* 120 */ 0x8888888888888889ull, 0x0000000000000000ull,  6, 0 },
    { /* 121 */ 0x8767AB5F34E47EF1ull, 0x8767AB5F34E47EF1ull,  6, 0 },
    { /* 122 */ 0x864B8A7DE6D1D608ull, 0x864B8A7DE6D1D608ull,  6, 0 },
    { /* 123 */ 0x8534085340853408ull, 0x8534085340853408ull,  6, 0 },
    { /* 124 */ 0x8421084210842108ull, 0x8421084210842108ull,  6, 0 },
    { /* 125 */ 0x83126E978D4FDF3Bull, 0x83126E978D4FDF3Bull,  6, 0 },
    { /* 126 */ 0x8208208208208208ull, 0x8208208208208208ull,  6, 0 },
    { /* 127 */ 0x8102040810204081ull, 0x8102040810204081ull,  6, 0 },
    { /* 128 */ 0x0200000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /* 129 */ 0xFE03F80FE03F80FFull, 0x0000000000000000ull,  7, 0 },
    { /* 130 */ 0xFC0FC0FC0FC0FC10ull, 0x0000000000000000ull,  7, 0 },
    { /* 131 */ 0xFA232CF252138AC0ull, 0x0000000000000000ull,  7, 0 },
    { /* 132 */ 0xF83E0F83E0F83E10ull, 0x0000000000000000ull,  7, 0 },
    { /* 133 */ 0xF6603D980F6603DAull, 0x0000000000000000ull,  7, 0 },
    { /* 134 */ 0xF4898D5F85BB3951ull, 0x0000000000000000ull,  7, 0 },
    { /* 135 */ 0xF2B9D6480F2B9D65ull, 0x0000000000000000ull,  7, 0 },
    { /* 136 */ 0xF0F0F0F0F0F0F0F1ull, 0x0000000000000000ull,  7, 0 },
    { /* 137 */ 0xEF2EB71FC4345238ull, 0xEF2EB71FC4345238ull,  7, 0 },
    { /* 138 */ 0xED7303B5CC0ED731ull, 0x0000000000000000ull,  7, 0 },
    { /* 139 */ 0xEBBDB2A5C1619C8Cull, 0x0000000000000000ull,  7, 0 },
    { /* 140 */ 0xEA0EA0EA0EA0EA0Full, 0x0000000000000000ull,  7, 0 },
    { /* 141 */ 0xE865AC7B7603A197ull, 0x0000000000000000ull,  7, 0 },
    { /* 142 */ 0xE6C2B4481CD85689ull, 0xE6C2B4481CD85689ull,  7, 0 },
    { /* 143 */ 0xE525982AF70C880Full, 0x0000000000000000ull,  7, 0 },
    { /* 144 */ 0xE38E38E38E38E38Full, 0x0000000000000000ull,  7, 0 },
    { /* 145 */ 0xE1FC780E1FC780E2ull, 0x0000000000000000ull,  7, 0 },
    { /* 146 */ 0xE070381C0E070382ull, 0x0000000000000000ull,  7, 0 },
    { /* 147 */ 0xDEE95C4CA037BA57ull, 0xDEE95C4CA037BA57ull,  7, 0 },
    { /* 148 */ 0xDD67C8A60DD67C8Bull, 0x0000000000000000ull,  7, 0 },
    { /* 149 */ 0xDBEB61EED19C5958ull, 0x0000000000000000ull,  7, 0 },
    { /* 150 */ 0xDA740DA740DA740Eull, 0x0000000000000000ull,  7, 0 },
    { /* 151 */ 0xD901B2036406C80Eull, 0x0000000000000000ull,  7, 0 },
    { /* 152 */ 0xD79435E50D79435Full, 0x0000000000000000ull,  7, 0 },
    { /* 153 */ 0xD62B80D62B80D62Cull, 0x0000000000000000ull,  7, 0 },
    { /* 154 */ 0xD4C77B03531DEC0Eull, 0x0000000000000000ull,  7, 0 },
    { /* 155 */ 0xD3680D3680D3680Eull, 0x0000000000000000ull,  7, 0 },
    { /* 156 */ 0xD20D20D20D20D20Dull, 0xD20D20D20D20D20Dull,  7, 0 },
    { /* 157 */ 0xD0B69FCBD2580D0Cull, 0x0000000000000000ull,  7, 0 },
    { /* 158 */ 0xCF6474A8819EC8EAull, 0x0000000000000000ull,  7, 0 },
    { /* 159 */ 0xCE168A7725080CE2ull, 0x0000000000000000ull,  7, 0 },
    { /* 160 */ 0xCCCCCCCCCCCCCCCDull, 0x0000000000000000ull,  7, 0 },
    { /* 161 */ 0xCB8727C065C393E0ull, 0xCB8727C065C393E0ull,  7, 0 },
    { /* 162 */ 0xCA4587E6B74F0329ull, 0xCA4587E6B74F0329ull,  7, 0 },
    { /* 163 */ 0xC907DA4E871146ADull, 0x0000000000000000ull,  7, 0 },
    { /* 164 */ 0xC7CE0C7CE0C7CE0Dull, 0x0000000000000000ull,  7, 0 },
    { /* 165 */ 0xC6980C6980C6980Dull, 0x0000000000000000ull,  7, 0 },
    { /* 166 */ 0xC565C87B5F9D4D1Cull, 0x0000000000000000ull,  7, 0 },
    { /* 167 */ 0xC4372F855D824CA6ull, 0x0000000000000000ull,  7, 0 },
    { /* 168 */ 0xC30C30C30C30C30Cull, 0xC30C30C30C30C30Cull,  7, 0 },
    { /* 169 */ 0xC1E4BBD595F6E947ull, 0xC1E4BBD595F6E947ull,  7, 0 },
    { /* 170 */ 0xC0C0C0C0C0C0C0C1ull, 0x0000000000000000ull,  7, 0 },
    { /* 171 */ 0xBFA02FE80BFA02FFull, 0x0000000000000000ull,  7, 0 },
    { /* 172 */ 0xBE82FA0BE82FA0BFull, 0x0000000000000000ull,  7, 0 },
    { /* 173 */ 0xBD69104707661AA3ull, 0x0000000000000000ull,  7, 0 },
    { /* 174 */ 0xBC52640BC52640BDull, 0x0000000000000000ull,  7, 0 },
    { /* 175 */ 0xBB3EE721A54D880Cull, 0x0000000000000000ull,  7, 0 },
    { /* 176 */ 0xBA2E8BA2E8BA2E8Cull, 0x0000000000000000ull,  7, 0 },
    { /* 177 */ 0xB92143FA36F5E02Full, 0x0000000000000000ull,  7, 0 },
    { /* 178 */ 0xB81702E05C0B8170ull, 0xB81702E05C0B8170ull,  7, 0 },
    { /* 179 */ 0xB70FBB5A19BE3659ull, 0x0000000000000000ull,  7, 0 },
    { /* 180 */ 0xB60B60B60B60B60Cull, 0x0000000000000000ull,  7, 0 },
    { /* 181 */ 0xB509E68A9B94821Full, 0xB509E68A9B94821Full,  7, 0 },
    { /* 182 */ 0xB40B40B40B40B40Bull, 0xB40B40B40B40B40Bull,  7, 0 },
    { /* 183 */ 0xB30F63528917C80Bull, 0xB30F63528917C80Bull,  7, 0 },
    { /* 184 */ 0xB21642C8590B2164ull, 0xB21642C8590B2164ull,  7, 0 },
    { /* 185 */ 0xB11FD3B80B11FD3Cull, 0x0000000000000000ull,  7, 0 },
    { /* 186 */ 0xB02C0B02C0B02C0Bull, 0xB02C0B02C0B02C0Bull,  7, 0 },
    { /* 187 */ 0xAF3ADDC680AF3ADEull, 0x0000000000000000ull,  7, 0 },
    { /* 188 */ 0xAE4C415C9882B931ull, 0xAE4C415C9882B931ull,  7, 0 },
    { /* 189 */ 0xAD602B580AD602B6ull, 0x0000000000000000ull,  7, 0 },
    { /* 190 */ 0xAC7691840AC76918ull, 0xAC7691840AC76918ull,  7, 0 },
    { /* 191 */ 0xAB8F69E28359CD12ull, 0x0000000000000000ull,  7, 0 },
    { /* 192 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  7, 0 },
    { /* 193 */ 0xA9C84A47A07F5638ull, 0x0000000000000000ull,  7, 0 },
    { /* 194 */ 0xA8E83F5717C0A8E8ull, 0xA8E83F5717C0A8E8ull,  7, 0 },
    { /* 195 */ 0xA80A80A80A80A80Bull, 0x0000000000000000ull,  7, 0 },
    { /* 196 */ 0xA72F05397829CBC1ull, 0xA72F05397829CBC1ull,  7, 0 },
    { /* 197 */ 0xA655C4392D7B73A8ull, 0x0000000000000000ull,  7, 0 },
    { /* 198 */ 0xA57EB50295FAD40Aull, 0xA57EB50295FAD40Aull,  7, 0 },
    { /* 199 */ 0xA4A9CF1D96833751ull, 0xA4A9CF1D96833751ull,  7, 0 },
    { /* 200 */ 0xA3D70A3D70A3D70Aull, 0xA3D70A3D70A3D70Aull,  7, 0 },
    { /* 201 */ 0xA3065E3FAE7CD0E0ull, 0xA3065E3FAE7CD0E0ull,  7, 0 },
    { /* 202 */ 0xA237C32B16CFD772ull, 0xA237C32B16CFD772ull,  7, 0 },
    { /* 203 */ 0xA16B312EA8FC377Dull, 0x0000000000000000ull,  7, 0 },
    { /* 204 */ 0xA0A0A0A0A0A0A0A1ull, 0x0000000000000000ull,  7, 0 },
    { /* 205 */ 0x9FD809FD809FD80Aull, 0x0000000000000000ull,  7, 0 },
    { /* 206 */ 0x9F1165E7254813E2ull, 0x9F1165E7254813E2ull,  7, 0 },
    { /* 207 */ 0x9E4CAD23DD5F3A20ull, 0x9E4CAD23DD5F3A20ull,  7, 0 },
    { /* 208 */ 0x9D89D89D89D89D8Aull, 0x0000000000000000ull,  7, 0 },
    { /* 209 */ 0x9CC8E160C3FB19B9ull, 0x0000000000000000ull,  7, 0 },
    { /* 210 */ 0x9C09C09C09C09C0Aull, 0x0000000000000000ull,  7, 0 },
    { /* 211 */ 0x9B4C6F9EF03A3CAAull, 0x0000000000000000ull,  7, 0 },
    { /* 212 */ 0x9A90E7D95BC609A9ull, 0x9A90E7D95BC609A9ull,  7, 0 },
    { /* 213 */ 0x99D722DABDE58F06ull, 0x99D722DABDE58F06ull,  7, 0 },
    { /* 214 */ 0x991F1A515885FB37ull, 0x991F1A515885FB37ull,  7, 0 },
    { /* 215 */ 0x9868C809868C8099ull, 0x0000000000000000ull,  7, 0 },
    { /* 216 */ 0x97B425ED097B425Full, 0x0000000000000000ull,  7, 0 },
    { /* 217 */ 0x97012E025C04B80Aull, 0x0000000000000000ull,  7, 0 },
    { /* 218 */ 0x964FDA6C0964FDA7ull, 0x0000000000000000ull,  7, 0 },
    { /* 219 */ 0x95A02568095A0257ull, 0x0000000000000000ull,  7, 0 },
    { /* 220 */ 0x94F2094F2094F209ull, 0x94F2094F2094F209ull,  7, 0 },
    { /* 221 */ 0x9445809445809446ull, 0x0000000000000000ull,  7, 0 },
    { /* 222 */ 0x939A85C40939A85Cull, 0x939A85C40939A85Cull,  7, 0 },
    { /* 223 */ 0x92F113840497889Cull, 0x92F113840497889Cull,  7, 0 },
    { /* 224 */ 0x9249249249249249ull, 0x9249249249249249ull,  7, 0 },
    { /* 225 */ 0x91A2B3C4D5E6F809ull, 0x91A2B3C4D5E6F809ull,  7, 0 },
    { /* 226 */ 0x90FDBC090FDBC091ull, 0x0000000000000000ull,  7, 0 },
    { /* 227 */ 0x905A38633E06C43Bull, 0x0000000000000000ull,  7, 0 },
    { /* 228 */ 0x8FB823EE08FB823Full, 0x0000000000000000ull,  7, 0 },
    { /* 229 */ 0x8F1779D9FDC3A219ull, 0x0000000000000000ull,  7, 0 },
    { /* 230 */ 0x8E78356D1408E783ull, 0x8E78356D1408E783ull,  7, 0 },
    { /* 231 */ 0x8DDA520237694809ull, 0x0000000000000000ull,  7, 0 },
    { /* 232 */ 0x8D3DCB08D3DCB08Dull, 0x8D3DCB08D3DCB08Dull,  7, 0 },
    { /* 233 */ 0x8CA29C046514E023ull, 0x8CA29C046514E023ull,  7, 0 },
    { /* 234 */ 0x8C08C08C08C08C09ull, 0x0000000000000000ull,  7, 0 },
    { /* 235 */ 0x8B70344A139BC75Aull, 0x8B70344A139BC75Aull,  7, 0 },
    { /* 236 */ 0x8AD8F2FBA9386823ull, 0x0000000000000000ull,  7, 0 },
    { /* 237 */ 0x8A42F8705669DB46ull, 0x8A42F8705669DB46ull,  7, 0 },
    { /* 238 */ 0x89AE4089AE4089AEull, 0x89AE4089AE4089AEull,  7, 0 },
    { /* 239 */ 0x891AC73AE9819B50ull, 0x891AC73AE9819B50ull,  7, 0 },
    { /* 240 */ 0x8888888888888889ull, 0x0000000000000000ull,  7, 0 },
    { /* 241 */ 0x87F78087F78087F8ull, 0x0000000000000000ull,  7, 0 },
    { /* 242 */ 0x8767AB5F34E47EF1ull, 0x8767AB5F34E47EF1ull,  7, 0 },
    { /* 243 */ 0x86D905447A34ACC6ull, 0x86D905447A34ACC6ull,  7, 0 },
    { /* 244 */ 0x864B8A7DE6D1D608ull, 0x864B8A7DE6D1D608ull,  7, 0 },
    { /* 245 */ 0x85BF37612CEE3C9Bull, 0x0000000000000000ull,  7, 0 },
    { /* 246 */ 0x8534085340853408ull, 0x8534085340853408ull,  7, 0 },
    { /* 247 */ 0x84A9F9C8084A9F9Dull, 0x0000000000000000ull,  7, 0 },
    { /* 248 */ 0x8421084210842108ull, 0x8421084210842108ull,  7, 0 },
    { /* 249 */ 0x839930523FBE3368ull, 0x0000000000000000ull,  7, 0 },
    { /* 250 */ 0x83126E978D4FDF3Bull, 0x83126E978D4FDF3Bull,  7, 0 },
    { /* 251 */ 0x828CBFBEB9A020A3ull, 0x828CBFBEB9A020A3ull,  7, 0 },
    { /* 252 */ 0x8208208208208208ull, 0x8208208208208208ull,  7, 0 },
    { /* 253 */ 0x81848DA8FAF0D277ull, 0x81848DA8FAF0D277ull,  7, 0 },
    { /* 254 */ 0x8102040810204081ull, 0x8102040810204081ull,  7, 0 },
    { /* 255 */ 0x8080808080808081ull, 0x0000000000000000ull,  7, 0 },
    { /* 256 */ 0x0100000000000000ull, 0x0000000000000000ull,  0, 0 },
    { /* 257 */ 0xFF00FF00FF00FF01ull, 0x0000000000000000ull,  8, 0 },
    { /* 258 */ 0xFE03F80FE03F80FFull, 0x0000000000000000ull,  8, 0 },
    { /* 259 */ 0xFD08E5500FD08E55ull, 0xFD08E5500FD08E55ull,  8, 0 },
    { /* 260 */ 0xFC0FC0FC0FC0FC10ull, 0x0000000000000000ull,  8, 0 },
    { /* 261 */ 0xFB18856506DDABA6ull, 0x0000000000000000ull,  8, 0 },
    { /* 262 */ 0xFA232CF252138AC0ull, 0x0000000000000000ull,  8, 0 },
    { /* 263 */ 0xF92FB2211855A866ull, 0x0000000000000000ull,  8, 0 },
    { /* 264 */ 0xF83E0F83E0F83E10ull, 0x0000000000000000ull,  8, 0 },
    { /* 265 */ 0xF74E3FC22C700F75ull, 0x0000000000000000ull,  8, 0 },
    { /* 266 */ 0xF6603D980F6603DAull, 0x0000000000000000ull,  8, 0 },
    { /* 267 */ 0xF57403D5D00F5741ull, 0x0000000000000000ull,  8, 0 },
    { /* 268 */ 0xF4898D5F85BB3951ull, 0x0000000000000000ull,  8, 0 },
    { /* 269 */ 0xF3A0D52CBA872337ull, 0x0000000000000000ull,  8, 0 },
    { /* 270 */ 0xF2B9D6480F2B9D65ull, 0x0000000000000000ull,  8, 0 },
    { /* 271 */ 0xF1D48BCEE0D399FBull, 0x0000000000000000ull,  8, 0 },
    { /* 272 */ 0xF0F0F0F0F0F0F0F1ull, 0x0000000000000000ull,  8, 0 },
    { /* 273 */ 0xF00F00F00F00F00Full, 0xF00F00F00F00F00Full,  8, 0 },
    { /* 274 */ 0xEF2EB71FC4345238ull, 0xEF2EB71FC4345238ull,  8, 0 },
    { /* 275 */ 0xEE500EE500EE500Full, 0x0000000000000000ull,  8, 0 },
    { /* 276 */ 0xED7303B5CC0ED731ull, 0x0000000000000000ull,  8, 0 },
    { /* 277 */ 0xEC979118F3FC4DA2ull, 0x0000000000000000ull,  8, 0 },
    { /* 278 */ 0xEBBDB2A5C1619C8Cull, 0x0000000000000000ull,  8, 0 },
    { /* 279 */ 0xEAE56403AB95900Full, 0x0000000000000000ull,  8, 0 },
    { /* 280 */ 0xEA0EA0EA0EA0EA0Full, 0x0000000000000000ull,  8, 0 },
    { /* 281 */ 0xE939651FE2D8D35Cull, 0xE939651FE2D8D35Cull,  8, 0 },
    { /* 282 */ 0xE865AC7B7603A197ull, 0x0000000000000000ull,  8, 0 },
    { /* 283 */ 0xE79372E225FE30DAull, 0x0000000000000000ull,  8, 0 },
    { /* 284 */ 0xE6C2B4481CD85689ull, 0xE6C2B4481CD85689ull,  8, 0 },
    { /* 285 */ 0xE5F36CB00E5F36CBull, 0xE5F36CB00E5F36CBull,  8, 0 },
    { /* 286 */ 0xE525982AF70C880Full, 0x0000000000000000ull,  8, 0 },
    { /* 287 */ 0xE45932D7DC52100Full, 0x0000000000000000ull,  8, 0 },
    { /* 288 */ 0xE38E38E38E38E38Full, 0x0000000000000000ull,  8, 0 },
    { /* 289 */ 0xE2C4A6886A4C2E10ull, 0x0000000000000000ull,  8, 0 },
    { /* 290 */ 0xE1FC780E1FC780E2ull, 0x0000000000000000ull,  8, 0 },
    { /* 291 */ 0xE135A9C97500E136ull, 0x0000000000000000ull,  8, 0 },
    { /* 292 */ 0xE070381C0E070382ull, 0x0000000000000000ull,  8, 0 },
    { /* 293 */ 0xDFAC1F74346C5760ull, 0x0000000000000000ull,  8, 0 },
    { /* 294 */ 0xDEE95C4CA037BA57ull, 0xDEE95C4CA037BA57ull,  8, 0 },
    { /* 295 */ 0xDE27EB2C41F3D9D2ull, 0x0000000000000000ull,  8, 0 },
    { /* 296 */ 0xDD67C8A60DD67C8Bull, 0x0000000000000000ull,  8, 0 },
    { /* 297 */ 0xDCA8F158C7F91AB9ull, 0x0000000000000000ull,  8, 0 },
    { /* 298 */ 0xDBEB61EED19C5958ull, 0x0000000000000000ull,  8, 0 },
    { /* 299 */ 0xDB2F171DF7702919ull, 0x0000000000000000ull,  8, 0 },
    { /* 300 */ 0xDA740DA740DA740Eull, 0x0000000000000000ull,  8, 0 },
    { /* 301 */ 0xD9BA4256C0366E91ull, 0x0000000000000000ull,  8, 0 },
    { /* 302 */ 0xD901B2036406C80Eull, 0x0000000000000000ull,  8, 0 },
    { /* 303 */ 0xD84A598EC9151F43ull, 0x0000000000000000ull,  8, 0 },
    { /* 304 */ 0xD79435E50D79435Full, 0x0000000000000000ull,  8, 0 },
    { /* 305 */ 0xD6DF43FCA482F00Eull, 0x0000000000000000ull,  8, 0 },
    { /* 306 */ 0xD62B80D62B80D62Cull, 0x0000000000000000ull,  8, 0 },
    { /* 307 */ 0xD578E97C3F5FE551ull, 0x0000000000000000ull,  8, 0 },
    { /* 308 */ 0xD4C77B03531DEC0Eull, 0x0000000000000000ull,  8, 0 },
    { /* 309 */ 0xD4173289870AC52Eull, 0x0000000000000000ull,  8, 0 },
    { /* 310 */ 0xD3680D3680D3680Eull, 0x0000000000000000ull,  8, 0 },
    { /* 311 */ 0xD2BA083B445250ACull, 0x0000000000000000ull,  8, 0 },
    { /* 312 */ 0xD20D20D20D20D20Dull, 0xD20D20D20D20D20Dull,  8, 0 },
    { /* 313 */ 0xD161543E28E50274ull, 0xD161543E28E50274ull,  8, 0 },
    { /* 314 */ 0xD0B69FCBD2580D0Cull, 0x0000000000000000ull,  8, 0 },
    { /* 315 */ 0xD00D00D00D00D00Dull, 0xD00D00D00D00D00Dull,  8, 0 },
    { /* 316 */ 0xCF6474A8819EC8EAull, 0x0000000000000000ull,  8, 0 },
    { /* 317 */ 0xCEBCF8BB5B4169CBull, 0x0000000000000000ull,  8, 0 },
    { /* 318 */ 0xCE168A7725080CE2ull, 0x0000000000000000ull,  8, 0 },
    { /* 319 */ 0xCD712752A886D242ull, 0x0000000000000000ull,  8, 0 },
    { /* 320 */ 0xCCCCCCCCCCCCCCCDull, 0x0000000000000000ull,  8, 0 },
    { /* 321 */ 0xCC29786C7607F99Full, 0x0000000000000000ull,  8, 0 },
    { /* 322 */ 0xCB8727C065C393E0ull, 0xCB8727C065C393E0ull,  8, 0 },
    { /* 323 */ 0xCAE5D85F1BBD6C95ull, 0xCAE5D85F1BBD6C95ull,  8, 0 },
    { /* 324 */ 0xCA4587E6B74F0329ull, 0xCA4587E6B74F0329ull,  8, 0 },
    { /* 325 */ 0xC9A633FCD967300Dull, 0x0000000000000000ull,  8, 0 },
    { /* 326 */ 0xC907DA4E871146ADull, 0x0000000000000000ull,  8, 0 },
    { /* 327 */ 0xC86A78900C86A789ull, 0xC86A78900C86A789ull,  8, 0 },
    { /* 328 */ 0xC7CE0C7CE0C7CE0Dull, 0x0000000000000000ull,  8, 0 },
    { /* 329 */ 0xC73293D789B9F838ull, 0xC73293D789B9F838ull,  8, 0 },
    { /* 330 */ 0xC6980C6980C6980Dull, 0x0000000000000000ull,  8, 0 },
    { /* 331 */ 0xC5FE740317F9D00Dull, 0x0000000000000000ull,  8, 0 },
    { /* 332 */ 0xC565C87B5F9D4D1Cull, 0x0000000000000000ull,  8, 0 },
    { /* 333 */ 0xC4CE07B00C4CE07Bull, 0xC4CE07B00C4CE07Bull,  8, 0 },
    { /* 334 */ 0xC4372F855D824CA6ull, 0x0000000000000000ull,  8, 0 },
    { /* 335 */ 0xC3A13DE60495C774ull, 0x0000000000000000ull,  8, 0 },
    { /* 336 */ 0xC30C30C30C30C30Cull, 0xC30C30C30C30C30Cull,  8, 0 },
    { /* 337 */ 0xC2780613C0309E02ull, 0x0000000000000000ull,  8, 0 },
    { /* 338 */ 0xC1E4BBD595F6E947ull, 0xC1E4BBD595F6E947ull,  8, 0 },
    { /* 339 */ 0xC152500C152500C2ull, 0x0000000000000000ull,  8, 0 },
    { /* 340 */ 0xC0C0C0C0C0C0C0C1ull, 0x0000000000000000ull,  8, 0 },
    { /* 341 */ 0xC0300C0300C0300Cull, 0xC0300C0300C0300Cull,  8, 0 },
    { /* 342 */ 0xBFA02FE80BFA02FFull, 0x0000000000000000ull,  8, 0 },
    { /* 343 */ 0xBF112A8AD278E8DDull, 0x0000000000000000ull,  8, 0 },
    { /* 344 */ 0xBE82FA0BE82FA0BFull, 0x0000000000000000ull,  8, 0 },
    { /* 345 */ 0xBDF59C91700BDF5Aull, 0x0000000000000000ull,  8, 0 },
    { /* 346 */ 0xBD69104707661AA3ull, 0x0000000000000000ull,  8, 0 },
    { /* 347 */ 0xBCDD535DB1CC5B7Bull, 0xBCDD535DB1CC5B7Bull,  8, 0 },
    { /* 348 */ 0xBC52640BC52640BDull, 0x0000000000000000ull,  8, 0 },
    { /* 349 */ 0xBBC8408CD63069A1ull, 0x0000000000000000ull,  8, 0 },
    { /* 350 */ 0xBB3EE721A54D880Cull, 0x0000000000000000ull,  8, 0 },
    { /* 351 */ 0xBAB656100BAB6561ull, 0xBAB656100BAB6561ull,  8, 0 },
    { /* 352 */ 0xBA2E8BA2E8BA2E8Cull, 0x0000000000000000ull,  8, 0 },
    { /* 353 */ 0xB9A7862A0FF46588ull, 0x0000000000000000ull,  8, 0 },
    { /* 354 */ 0xB92143FA36F5E02Full, 0x0000000000000000ull,  8, 0 },
    { /* 355 */ 0xB89BC36CE3E0453Bull, 0x0000000000000000ull,  8, 0 },
    { /* 356 */ 0xB81702E05C0B8170ull, 0xB81702E05C0B8170ull,  8, 0 },
    { /* 357 */ 0xB79300B79300B793ull, 0xB79300B79300B793ull,  8, 0 },
    { /* 358 */ 0xB70FBB5A19BE3659ull, 0x0000000000000000ull,  8, 0 },
    { /* 359 */ 0xB68D31340E4307D8ull, 0xB68D31340E4307D8ull,  8, 0 },
    { /* 360 */ 0xB60B60B60B60B60Cull, 0x0000000000000000ull,  8, 0 },
    { /* 361 */ 0xB58A485518D1E7E4ull, 0x0000000000000000ull,  8, 0 },
    { /* 362 */ 0xB509E68A9B94821Full, 0xB509E68A9B94821Full,  8, 0 },
    { /* 363 */ 0xB48A39D44685FE97ull, 0x0000000000000000ull,  8, 0 },
    { /* 364 */ 0xB40B40B40B40B40Bull, 0xB40B40B40B40B40Bull,  8, 0 },
    { /* 365 */ 0xB38CF9B00B38CF9Bull, 0xB38CF9B00B38CF9Bull,  8, 0 },
    { /* 366 */ 0xB30F63528917C80Bull, 0xB30F63528917C80Bull,  8, 0 },
    { /* 367 */ 0xB2927C29DA5519CFull, 0xB2927C29DA5519CFull,  8, 0 },
    { /* 368 */ 0xB21642C8590B2164ull, 0xB21642C8590B2164ull,  8, 0 },
    { /* 369 */ 0xB19AB5C45606F00Bull, 0xB19AB5C45606F00Bull,  8, 0 },
    { /* 370 */ 0xB11FD3B80B11FD3Cull, 0x0000000000000000ull,  8, 0 },
    { /* 371 */ 0xB0A59B418D749D54ull, 0x0000000000000000ull,  8, 0 },
    { /* 372 */ 0xB02C0B02C0B02C0Bull, 0xB02C0B02C0B02C0Bull,  8, 0 },
    { /* 373 */ 0xAFB321A1496FDF0Full, 0x0000000000000000ull,  8, 0 },
    { /* 374 */ 0xAF3ADDC680AF3ADEull, 0x0000000000000000ull,  8, 0 },
    { /* 375 */ 0xAEC33E1F671529A5ull, 0x0000000000000000ull,  8, 0 },
    { /* 376 */ 0xAE4C415C9882B931ull, 0xAE4C415C9882B931ull,  8, 0 },
    { /* 377 */ 0xADD5E6323FD48A87ull, 0x0000000000000000ull,  8, 0 },
    { /* 378 */ 0xAD602B580AD602B6ull, 0x0000000000000000ull,  8, 0 },
    { /* 379 */ 0xACEB0F891E6551BBull, 0xACEB0F891E6551BBull,  8, 0 },
    { /* 380 */ 0xAC7691840AC76918ull, 0xAC7691840AC76918ull,  8, 0 },
    { /* 381 */ 0xAC02B00AC02B00ACull, 0xAC02B00AC02B00ACull,  8, 0 },
    { /* 382 */ 0xAB8F69E28359CD12ull, 0x0000000000000000ull,  8, 0 },
    { /* 383 */ 0xAB1CBDD3E2970F60ull, 0x0000000000000000ull,  8, 0 },
    { /* 384 */ 0xAAAAAAAAAAAAAAABull, 0x0000000000000000ull,  8, 0 },
    { /* 385 */ 0xAA392F35DC17F00Bull, 0x0000000000000000ull,  8, 0 },
    { /* 386 */ 0xA9C84A47A07F5638ull, 0x0000000000000000ull,  8, 0 },
    { /* 387 */ 0xA957FAB5402A55FFull, 0x0000000000000000ull,  8, 0 },
    { /* 388 */ 0xA8E83F5717C0A8E8ull, 0xA8E83F5717C0A8E8ull,  8, 0 },
    { /* 389 */ 0xA87917088E262B6Full, 0xA87917088E262B6Full,  8, 0 },
    { /* 390 */ 0xA80A80A80A80A80Bull, 0x0000000000000000ull,  8, 0 },
    { /* 391 */ 0xA79C7B16EA64D422ull, 0xA79C7B16EA64D422ull,  8, 0 },
    { /* 392 */ 0xA72F05397829CBC1ull, 0xA72F05397829CBC1ull,  8, 0 },
    { /* 393 */ 0xA6C21DF6E1625C80ull, 0x0000000000000000ull,  8, 0 },
    { /* 394 */ 0xA655C4392D7B73A8ull, 0x0000000000000000ull,  8, 0 },
    { /* 395 */ 0xA5E9F6ED347F0721ull, 0xA5E9F6ED347F0721ull,  8, 0 },
    { /* 396 */ 0xA57EB50295FAD40Aull, 0xA57EB50295FAD40Aull,  8, 0 },
    { /* 397 */ 0xA513FD6BB00A5140ull, 0x0000000000000000ull,  8, 0 },
    { /* 398 */ 0xA4A9CF1D96833751ull, 0xA4A9CF1D96833751ull,  8, 0 },
    { /* 399 */ 0xA44029100A440291ull, 0xA44029100A440291ull,  8, 0 },
    { /* 400 */ 0xA3D70A3D70A3D70Aull, 0xA3D70A3D70A3D70Aull,  8, 0 },
    { /* 401 */ 0xA36E71A2CB033128ull, 0xA36E71A2CB033128ull,  8, 0 },
    { /* 402 */ 0xA3065E3FAE7CD0E0ull, 0xA3065E3FAE7CD0E0ull,  8, 0 },
    { /* 403 */ 0xA29ECF163BB6500Aull, 0xA29ECF163BB6500Aull,  8, 0 },
    { /* 404 */ 0xA237C32B16CFD772ull, 0xA237C32B16CFD772ull,  8, 0 },
    { /* 405 */ 0xA1D139855F7268EEull, 0x0000000000000000ull,  8, 0 },
    { /* 406 */ 0xA16B312EA8FC377Dull, 0x0000000000000000ull,  8, 0 },
    { /* 407 */ 0xA105A932F2CA891Full, 0x0000000000000000ull,  8, 0 },
    { /* 408 */ 0xA0A0A0A0A0A0A0A1ull, 0x0000000000000000ull,  8, 0 },
    { /* 409 */ 0xA03C1688732B3032ull, 0xA03C1688732B3032ull,  8, 0 },
    { /* 410 */ 0x9FD809FD809FD80Aull, 0x0000000000000000ull,  8, 0 },
    { /* 411 */ 0x9F747A152D7836D0ull, 0x9F747A152D7836D0ull,  8, 0 },
    { /* 412 */ 0x9F1165E7254813E2ull, 0x9F1165E7254813E2ull,  8, 0 },
    { /* 413 */ 0x9EAECC8D53AE2DDFull, 0x0000000000000000ull,  8, 0 },
    { /* 414 */ 0x9E4CAD23DD5F3A20ull, 0x9E4CAD23DD5F3A20ull,  8, 0 },
    { /* 415 */ 0x9DEB06C9194AA416ull, 0x9DEB06C9194AA416ull,  8, 0 },
    { /* 416 */ 0x9D89D89D89D89D8Aull, 0x0000000000000000ull,  8, 0 },
    { /* 417 */ 0x9D2921C3D6411308ull, 0x0000000000000000ull,  8, 0 },
    { /* 418 */ 0x9CC8E160C3FB19B9ull, 0x0000000000000000ull,  8, 0 },
    { /* 419 */ 0x9C69169B30446DFAull, 0x0000000000000000ull,  8, 0 },
    { /* 420 */ 0x9C09C09C09C09C0Aull, 0x0000000000000000ull,  8, 0 },
    { /* 421 */ 0x9BAADE8E4A2F6E10ull, 0x0000000000000000ull,  8, 0 },
    { /* 422 */ 0x9B4C6F9EF03A3CAAull, 0x0000000000000000ull,  8, 0 },
    { /* 423 */ 0x9AEE72FCF957C10Full, 0x9AEE72FCF957C10Full,  8, 0 },
    { /* 424 */ 0x9A90E7D95BC609A9ull, 0x9A90E7D95BC609A9ull,  8, 0 },
    { /* 425 */ 0x9A33CD67009A33CEull, 0x0000000000000000ull,  8, 0 },
    { /* 426 */ 0x99D722DABDE58F06ull, 0x99D722DABDE58F06ull,  8, 0 },
    { /* 427 */ 0x997AE76B50EFD00Aull, 0x0000000000000000ull,  8, 0 },
    { /* 428 */ 0x991F1A515885FB37ull, 0x991F1A515885FB37ull,  8, 0 },
    { /* 429 */ 0x98C3BAC74F5DB00Aull, 0x0000000000000000ull,  8, 0 },
    { /* 430 */ 0x9868C809868C8099ull, 0x0000000000000000ull,  8, 0 },
    { /* 431 */ 0x980E4156201301C8ull, 0x980E4156201301C8ull,  8, 0 },
    { /* 432 */ 0x97B425ED097B425Full, 0x0000000000000000ull,  8, 0 },
    { /* 433 */ 0x975A750FF68A58AFull, 0x975A750FF68A58AFull,  8, 0 },
    { /* 434 */ 0x97012E025C04B80Aull, 0x0000000000000000ull,  8, 0 },
    { /* 435 */ 0x96A850096A850097ull, 0x0000000000000000ull,  8, 0 },
    { /* 436 */ 0x964FDA6C0964FDA7ull, 0x0000000000000000ull,  8, 0 },
    { /* 437 */ 0x95F7CC72D1B887E9ull, 0x0000000000000000ull,  8, 0 },
    { /* 438 */ 0x95A02568095A0257ull, 0x0000000000000000ull,  8, 0 },
    { /* 439 */ 0x9548E4979E0829FDull, 0x0000000000000000ull,  8, 0 },
    { /* 440 */ 0x94F2094F2094F209ull, 0x94F2094F2094F209ull,  8, 0 },
    { /* 441 */ 0x949B92DDC02526E5ull, 0x0000000000000000ull,  8, 0 },
    { /* 442 */ 0x9445809445809446ull, 0x0000000000000000ull,  8, 0 },
    { /* 443 */ 0x93EFD1C50E726B7Cull, 0x93EFD1C50E726B7Cull,  8, 0 },
    { /* 444 */ 0x939A85C40939A85Cull, 0x939A85C40939A85Cull,  8, 0 },
    { /* 445 */ 0x93459BE6B009345Aull, 0x0000000000000000ull,  8, 0 },
    { /* 446 */ 0x92F113840497889Cull, 0x92F113840497889Cull,  8, 0 },
    { /* 447 */ 0x929CEBF48BBD90E5ull, 0x929CEBF48BBD90E5ull,  8, 0 },
    { /* 448 */ 0x9249249249249249ull, 0x9249249249249249ull,  8, 0 },
    { /* 449 */ 0x91F5BCB8BB02D9CDull, 0x0000000000000000ull,  8, 0 },
    { /* 450 */ 0x91A2B3C4D5E6F809ull, 0x91A2B3C4D5E6F809ull,  8, 0 },
    { /* 451 */ 0x9150091500915009ull, 0x9150091500915009ull,  8, 0 },
    { /* 452 */ 0x90FDBC090FDBC091ull, 0x0000000000000000ull,  8, 0 },
    { /* 453 */ 0x90ABCC0242AF3009ull, 0x90ABCC0242AF3009ull,  8, 0 },
    { /* 454 */ 0x905A38633E06C43Bull, 0x0000000000000000ull,  8, 0 },
    { /* 455 */ 0x9009009009009009ull, 0x9009009009009009ull,  8, 0 },
    { /* 456 */ 0x8FB823EE08FB823Full, 0x0000000000000000ull,  8, 0 },
    { /* 457 */ 0x8F67A1E3FDC26178ull, 0x8F67A1E3FDC26178ull,  8, 0 },
    { /* 458 */ 0x8F1779D9FDC3A219ull, 0x0000000000000000ull,  8, 0 },
    { /* 459 */ 0x8EC7AB397255E41Dull, 0x8EC7AB397255E41Dull,  8, 0 },
    { /* 460 */ 0x8E78356D1408E783ull, 0x8E78356D1408E783ull,  8, 0 },
    { /* 461 */ 0x8E2917E0E702C6CEull, 0x0000000000000000ull,  8, 0 },
    { /* 462 */ 0x8DDA520237694809ull, 0x0000000000000000ull,  8, 0 },
    { /* 463 */ 0x8D8BE33F95D71590ull, 0x8D8BE33F95D71590ull,  8, 0 },
    { /* 464 */ 0x8D3DCB08D3DCB08Dull, 0x8D3DCB08D3DCB08Dull,  8, 0 },
    { /* 465 */ 0x8CF008CF008CF009ull, 0x0000000000000000ull,  8, 0 },
    { /* 466 */ 0x8CA29C046514E023ull, 0x8CA29C046514E023ull,  8, 0 },
    { /* 467 */ 0x8C55841C815ED5CAull, 0x8C55841C815ED5CAull,  8, 0 },
    { /* 468 */ 0x8C08C08C08C08C09ull, 0x0000000000000000ull,  8, 0 },
    { /* 469 */ 0x8BBC50C8DEB420C0ull, 0x8BBC50C8DEB420C0ull,  8, 0 },
    { /* 470 */ 0x8B70344A139BC75Aull, 0x8B70344A139BC75Aull,  8, 0 },
    { /* 471 */ 0x8B246A87E19008B2ull, 0x8B246A87E19008B2ull,  8, 0 },
    { /* 472 */ 0x8AD8F2FBA9386823ull, 0x0000000000000000ull,  8, 0 },
    { /* 473 */ 0x8A8DCD1FEEAE465Cull, 0x8A8DCD1FEEAE465Cull,  8, 0 },
    { /* 474 */ 0x8A42F8705669DB46ull, 0x8A42F8705669DB46ull,  8, 0 },
    { /* 475 */ 0x89F87469A23920E0ull, 0x89F87469A23920E0ull,  8, 0 },
    { /* 476 */ 0x89AE4089AE4089AEull, 0x89AE4089AE4089AEull,  8, 0 },
    { /* 477 */ 0x89645C4F6E055DECull, 0x0000000000000000ull,  8, 0 },
    { /* 478 */ 0x891AC73AE9819B50ull, 0x891AC73AE9819B50ull,  8, 0 },
    { /* 479 */ 0x88D180CD3A4133D7ull, 0x88D180CD3A4133D7ull,  8, 0 },
    { /* 480 */ 0x8888888888888889ull, 0x0000000000000000ull,  8, 0 },
    { /* 481 */ 0x883FDDF00883FDDFull, 0x883FDDF00883FDDFull,  8, 0 },
    { /* 482 */ 0x87F78087F78087F8ull, 0x0000000000000000ull,  8, 0 },
    { /* 483 */ 0x87AF6FD5992D0D40ull, 0x87AF6FD5992D0D40ull,  8, 0 },
    { /* 484 */ 0x8767AB5F34E47EF1ull, 0x8767AB5F34E47EF1ull,  8, 0 },
    { /* 485 */ 0x872032AC13008720ull, 0x872032AC13008720ull,  8, 0 },
    { /* 486 */ 0x86D905447A34ACC6ull, 0x86D905447A34ACC6ull,  8, 0 },
    { /* 487 */ 0x869222B1ACF1CE96ull, 0x869222B1ACF1CE96ull,  8, 0 },
    { /* 488 */ 0x864B8A7DE6D1D608ull, 0x864B8A7DE6D1D608ull,  8, 0 },
    { /* 489 */ 0x86053C345A0B8473ull, 0x86053C345A0B8473ull,  8, 0 },
    { /* 490 */ 0x85BF37612CEE3C9Bull, 0x0000000000000000ull,  8, 0 },
    { /* 491 */ 0x85797B917765AB89ull, 0x85797B917765AB89ull,  8, 0 },
    { /* 492 */ 0x8534085340853408ull, 0x8534085340853408ull,  8, 0 },
    { /* 493 */ 0x84EEDD357C1B0085ull, 0x0000000000000000ull,  8, 0 },
    { /* 494 */ 0x84A9F9C8084A9F9Dull, 0x0000000000000000ull,  8, 0 },
    { /* 495 */ 0x84655D9BAB2F1008ull, 0x84655D9BAB2F1008ull,  8, 0 },
    { /* 496 */ 0x8421084210842108ull, 0x8421084210842108ull,  8, 0 },
    { /* 497 */ 0x83DCF94DC7570CE1ull, 0x0000000000000000ull,  8, 0 },
    { /* 498 */ 0x839930523FBE3368ull, 0x0000000000000000ull,  8, 0 },
    { /* 499 */ 0x8355ACE3C897DB10ull, 0x0000000000000000ull,  8, 0 },
    { /* 500 */ 0x83126E978D4FDF3Bull, 0x83126E978D4FDF3Bull,  8, 0 },
    { /* 501 */ 0x82CF750393AC3319ull, 0x82CF750393AC3319ull,  8, 0 },
    { /* 502 */ 0x828CBFBEB9A020A3ull, 0x828CBFBEB9A020A3ull,  8, 0 },
    { /* 503 */ 0x824A4E60B3262BC5ull, 0x0000000000000000ull,  8, 0 },
    { /* 504 */ 0x8208208208208208ull, 0x8208208208208208ull,  8, 0 },
    { /* 505 */ 0x81C635BC123FDF8Eull, 0x81C635BC123FDF8Eull,  8, 0 },
    { /* 506 */ 0x81848DA8FAF0D277ull, 0x81848DA8FAF0D277ull,  8, 0 },
    { /* 507 */ 0x814327E3B94F462Full, 0x814327E3B94F462Full,  8, 0 },
    { /* 508 */ 0x8102040810204081ull, 0x8102040810204081ull,  8, 0 },
    { /* 509 */ 0x80C121B28BD1BA98ull, 0x0000000000000000ull,  8, 0 },
    { /* 510 */ 0x8080808080808081ull, 0x0000000000000000ull,  8, 0 },
    { /* 511 */ 0x8040201008040201ull, 0x8040201008040201ull,  8, 0 },
};

static inline
DivRatio32_v1 preComputeDiv_u32_v1(std::uint32_t divisor)
{
    DivRatio32_v1 divRatio;
    std::uint32_t shift = floorLog2<std::uint32_t>(divisor);
    std::uint32_t multi;
    if ((divisor & (divisor - 1)) == 0) {
        if (divisor == 0)
            multi = 0;
        else if (divisor == 1)
            multi = 0xFFFFFFFFul;
        else
            multi = 1ul << (32 - shift);
        shift = 0;
    } else {
        // m = 2 ^ (32 + k)
        std::uint64_t m_64 = (std::uint64_t)1u << (32 + shift);
        // f = m / d
        double f = (double)m_64 / divisor;
        // Mul = |f| + 1;
        multi = (std::uint32_t)ceil(f);
    }
    divRatio.inverse = multi;
    divRatio.shift = shift;
    return divRatio;
}

template <int version = 0>
static inline
DivRatio32 preComputeDiv_u32(std::uint32_t divisor)
{
    std::uint32_t shift = floorLog2<std::uint32_t>(divisor);
    std::uint32_t inverse, bias = 0;
    if ((divisor & (divisor - 1)) == 0) {
        if (divisor == 0) {
            inverse = 0;
        }
        else if (divisor == 1) {
            inverse = 0xFFFFFFFFul;
            bias = 0xFFFFFFFFul;
        }
        else {
            inverse = 1ul << (32 - shift);
        }
        shift = 0;
    } else {
        assert(shift > 0);
        // scale = 2 ^ (32 + k)
        std::uint64_t scale_64 = (std::uint64_t)1u << (32 + shift);
        std::uint32_t inverse_down = (std::uint32_t)(scale_64 / divisor);
        // Inv_up = |f| + 1;
        std::uint32_t inverse_up = inverse_down + 1;
        // f = scale / d
        double f = (double)inverse_down + (double)(scale_64 % divisor) / divisor;

        //
        // See: https://bbs.emath.ac.cn/thread-521-3-1.html
        //

        // err = Inv_up - f
        double f_err = (double)inverse_up - f;
        assert(f_err != 0.0);
        // maxN = | scale / (d * err) |
        double max_N = (double)scale_64 / ((double)divisor * f_err);
        std::uint32_t maxN = (std::uint32_t)max_N;
        bool failed01 = (max_N < (double)0xFFFFFFFFul);
        bool failed04 = f_err >= (1.0 / divisor);

        //
        // See: https://github.com/rubenvannieuwpoort/division-by-constant-integers/blob/master/unsigned/runtime/unsigned_division.h
        //

        // product_up = Inv_up * d
        std::uint32_t product_up = inverse_up * divisor;
        bool failed02 = (product_up > (1u << shift));

        //
        // See: https://stackoverflow.com/questions/45353629/repeated-integer-division-by-a-runtime-constant-value
        //

        // r = scale - Inv_down * d
        std::uint32_t remainder = static_cast<std::uint32_t>(scale_64) - inverse_down * divisor;
        assert(divisor > remainder);
        // err == product_up
        std::uint32_t err = divisor - remainder;
        bool failed03 = (err >= (1u << shift));

        static const double kEpsilon = 0.005;

        // If f_err < ((2 ^ k) / d), use round up (ceil).
        inverse = inverse_up;

        bool failed = false;
        if (failed01 && failed02 && failed03) {
            failed = true;
        }
        else if (failed01 || failed02 || failed03) {
            printf("divisor = %u have errors. [ inverse_up = %u ]\n", divisor, inverse_up);
            printf("failed01 = %d, failed02 = %d, failed03 = %d\n\n",
                   (int)failed01, (int)failed02, (int)failed03);
            failed = true;
        }

        if (failed) {
            if (version == 2) {
                // If f_err >= ((2 ^ k) / d), use round down, and add = inverse_down.
                inverse = inverse_down;
                bias = inverse_down;
            } else {
                // In order to avoid the error of double precision floating-point.
                // In fact, due to the precision of double, most of the time,
                // f_err is a little larger than (err / divisor),
                // so, there is no problem without correcting this error.
                // However, we still fxied it here.
                double fix_f_err = f_err + kEpsilon;
                // Here, we use (err / divisor) instead of f_err.
                fix_f_err = ((double)err / divisor) + kEpsilon;
                // The maximum value is 1.0 times.
                if (fix_f_err > 1.0)
                    fix_f_err = 1.0;
                // If f_err >= ((2 ^ k) / d), use round down, and add = inverse_down.
                inverse = inverse_down;
                bias = (std::uint32_t)((double)inverse_down * fix_f_err);
            }
        }
    }

    DivRatio32 divRatio;
    divRatio.inverse = inverse;
    divRatio.bias = bias;
    divRatio.shift = shift;
    divRatio.reserve = 0;
    return divRatio;
}

static inline
DivRatio32 preComputeDiv_u32_64(std::uint32_t divisor)
{
    std::uint32_t shift = floorLog2<std::uint32_t>(divisor);
    std::uint32_t inverse, bias = 0;
    if ((divisor & (divisor - 1)) == 0) {
        if (divisor == 0) {
            inverse = 0;
        }
        else if (divisor == 1) {
            inverse = 0xFFFFFFFFul;
            bias = 0xFFFFFFFFul;
        }
        else {
            inverse = 1ull << (32 - shift);
        }
        shift = 0;
    } else {
        // scale = 2 ^ (32 + k)
        std::uint64_t scale_64 = (std::uint64_t)1u << (32 + shift);
        std::uint32_t inverse_down = (std::uint32_t)(scale_64 / divisor);
        // Inv_up = |f| + 1;
        std::uint32_t inverse_up = inverse_down + 1;
        // f = scale / d
        double f = (double)inverse_down + (double)(scale_64 % divisor) / divisor;

        //
        // See: https://bbs.emath.ac.cn/thread-521-3-1.html
        //

        // err = Inv_up - f
        double f_err = (double)inverse_up - f;
        // maxN = | scale / (d * err) |
        double max_N = (double)scale_64 / divisor / f_err;
        std::uint64_t maxN = (std::uint64_t)max_N;
        bool failed01 = (max_N < (double)0xFFFFFFFFul);

        //
        // See: https://github.com/rubenvannieuwpoort/division-by-constant-integers/blob/master/unsigned/runtime/unsigned_division.h
        //

        // product_up = Inv_up * d
        std::uint32_t product_up = (std::uint32_t)inverse_up * divisor;
        bool failed02 = (product_up > (1u << shift));

        //
        // See: https://stackoverflow.com/questions/45353629/repeated-integer-division-by-a-runtime-constant-value
        //

        // r = scale - Inv_down * d
        std::uint32_t remainder = (std::uint32_t)scale_64 - (std::uint32_t)inverse_down * divisor;
        assert(divisor > remainder);
        // err == product_up
        std::uint32_t err = divisor - remainder;
        bool failed03 = (err >= (1u << shift));

        // If f_err < ((2 ^ k) / d), use round up (ceil).
        inverse = inverse_up;

        scale_64 = (std::uint64_t)1u << (33 + shift);
        std::uint64_t new_inverse_down = scale_64 / divisor;
        std::uint64_t new_inverse_up = new_inverse_down + 1;

        if (failed01 && failed02 && failed03) {
            // If f_err >= ((2 ^ k) / d), use (2 * q' + 1), and shift + 1.
            assert(new_inverse_up == ((std::uint64_t)inverse_down * 2 + 1));
            inverse = inverse_down;
            bias = inverse_down;
        }
        else if (failed01 || failed02 || failed03) {
            inverse = inverse_down;
            bias = inverse_down;
            printf("divisor = %u have errors. [ inverse_up = %u ]\n",
                   divisor, (std::uint32_t)inverse_up);
            printf("failed01 = %d, failed02 = %d, failed03 = %d\n\n",
                   (int)failed01, (int)failed02, (int)failed03);
            //assert(false);
        }
    }

    DivRatio32 divRatio;
    divRatio.inverse = inverse;
    divRatio.bias = bias;
    divRatio.shift = 32 + shift;
    divRatio.reserve = 0;
    return divRatio;
}

static inline
DivRatio64 preComputeDiv_u64(std::uint64_t divisor)
{
    std::uint32_t shift = floorLog2<std::uint64_t>(divisor);
    std::uint64_t multi, add = 0;
    if ((divisor & (divisor - 1)) == 0) {
        if (divisor == 0) {
            multi = 0;
        }
        else if (divisor == 1) {
            multi = 0xFFFFFFFFFFFFFFFFull;
            add = 0xFFFFFFFFFFFFFFFFull;
        }
        else {
            multi = 1ull << (64 - shift);
        }
        shift = 0;
    } else {
#if defined(_MSC_VER)
        _uint128_t shift_128 = 1;
        shift_128 <<= (64 + shift);

        std::uint64_t inverse_down = (std::uint64_t)(shift_128 / (_uint128_t)divisor);
        std::uint64_t inverse_up = inverse_down + 1;

        // scale = 2 ^ (64 + k)
        _uint128_t scale_128 = (_uint128_t)1ull << (64 + shift);
        std::uint64_t f_inverse = (std::uint64_t)(scale_128 / (_uint128_t)divisor);
        std::uint64_t f_remainder= (std::uint64_t)(scale_128 % (_uint128_t)divisor);
        // f = scale / d
        double f = (double)f_inverse + (double)f_remainder / divisor;
        // Inv = |f| + 1;
        std::uint64_t f_inverse_up = (std::uint64_t)ceil(f);
        std::uint64_t f_inverse_down = f_inverse_up - 1;

        //
        // See: https://bbs.emath.ac.cn/thread-521-3-1.html
        //

        // err = Inv - f
        double f_err = (double)f_inverse_up - f;
        // maxN = | scale / (d * err) |
        double max_N = (double)scale_128 / divisor / f_err;
        std::uint64_t maxN = (std::uint64_t)max_N;
        bool failed01 = (max_N < (double)0xFFFFFFFFul);

        //
        // See: https://github.com/rubenvannieuwpoort/division-by-constant-integers/blob/master/unsigned/runtime/unsigned_division.h
        //

        // product_up = Inv_up * d
        std::uint64_t product_up = inverse_up * divisor;
        bool failed02 = (product_up > (1ull << shift));

        //
        // See: https://stackoverflow.com/questions/45353629/repeated-integer-division-by-a-runtime-constant-value
        //

        // r = scale - Inv_down * d
        std::uint64_t remainder = static_cast<std::uint64_t>(scale_128) - inverse_down * divisor;
        assert(divisor > remainder);
        // err == product_up
        std::uint64_t err = divisor - remainder;
        bool failed03 = (err > (1ull << shift));

        static const double kEpsilon = 0.005;

        // If f_err < ((2 ^ k) / d), use round up (ceil).
        multi = inverse_up;

        if (failed01 && failed02 && failed03) {
            // If f_err >= ((2 ^ k) / d), use round down, and add = inverse_down.
            multi = inverse_down;
            add = inverse_down;
        }
        else if (failed01 || failed02 || failed03) {
            multi = inverse_down;
            add = inverse_down;
            printf("divisor = [0x%08X] %u have errors. [ inverse_up = 0x%08X%08X ]\n",
                   (std::uint32_t)(divisor >> 32),
                   (std::uint32_t)(divisor & 0xFFFFFFFFul),
                   (std::uint32_t)(inverse_up >> 32),
                   (std::uint32_t)(inverse_up & 0xFFFFFFFFul));
            printf("failed01 = %d, failed02 = %d, failed03 = %d\n\n",
                   (int)failed01, (int)failed02, (int)failed03);
            //assert(false);
        }
#else
        __uint128_t shift_128 = (__uint128_t)1 << (64 + shift);
        // In fact, (shift_128 % divisor) isn't equal to 0 for ever when divisor isn't a even.
        std::uint64_t inverse_up;
        if ((shift_128 % divisor) != 0)
            inverse_up = (std::uint64_t)(shift_128 / divisor) + 1;
        else
            inverse_up = (std::uint64_t)(shift_128 / divisor);

        std::uint64_t inverse_down = inverse_up - 1;

        // scale = 2 ^ (64 + k)
        __uint128_t scale_128 = (__uint128_t)1ull << (64 + shift);
        std::uint64_t f_inverse = (std::uint64_t)(scale_128 / divisor);
        std::uint64_t f_remainder= (std::uint64_t)(scale_128 % divisor);
        // f = scale / d
        double f = (double)f_inverse + (double)f_remainder / divisor;
        // Inv_up = |f| + 1;
        std::uint64_t f_inverse_up = (std::uint64_t)ceil(f);
        std::uint64_t f_inverse_down = f_inverse_up - 1;

        //
        // See: https://bbs.emath.ac.cn/thread-521-3-1.html
        //

        // err = Inv_up - f
        double f_err = (double)f_inverse_up - f;
        // maxN = | scale / (d * err) |
        double max_N = (double)scale_128 / divisor / f_err;
        std::uint64_t maxN = (std::uint64_t)max_N;
        bool failed01 = (max_N < (double)0xFFFFFFFFul);

        //
        // See: https://github.com/rubenvannieuwpoort/division-by-constant-integers/blob/master/unsigned/runtime/unsigned_division.h
        //

        // product_up = Inv_up * d
        std::uint64_t product_up = inverse_up * divisor;
        bool failed02 = (product_up > (1ull << shift));

        //
        // See: https://stackoverflow.com/questions/45353629/repeated-integer-division-by-a-runtime-constant-value
        //

        // r = scale - Inv_down * d
        std::uint64_t remainder = static_cast<std::uint64_t>(scale_128) - inverse_down * divisor;
        assert(divisor > remainder);
        // err == product_up
        std::uint64_t err = divisor - remainder;
        bool failed03 = (err > (1ull << shift));

        static const double kEpsilon = 0.005;

        // If f_err < ((2 ^ k) / d), use round up (ceil).
        multi = inverse_up;

        if (failed01 && failed02 && failed03) {
            // If f_err >= ((2 ^ k) / d), use round down, and add = inverse_down.
            multi = inverse_down;
            add = inverse_down;
        }
        else if (failed01 || failed02 || failed03) {
            multi = inverse_down;
            add = inverse_down;
            printf("divisor = [0x%08X] %u have errors. [ inverse_up = 0x%08X%08X ]\n",
                   (std::uint32_t)(divisor >> 32),
                   (std::uint32_t)(divisor & 0xFFFFFFFFul),
                   (std::uint32_t)(inverse_up >> 32),
                   (std::uint32_t)(inverse_up & 0xFFFFFFFFul));
            printf("failed01 = %d, failed02 = %d, failed03 = %d\n\n",
                   (int)failed01, (int)failed02, (int)failed03);
            //assert(false);
        }
#endif
    }

    DivRatio64 divRatio;
    divRatio.inverse = multi;
    divRatio.bias = add;
    divRatio.shift = shift;
    divRatio.reserve = 0;
    return divRatio;
}

static inline
void genDivRatioTbl_u32_v1()
{
    DivRatio32_v1 divRatioTbl[kMaxDivTable];
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        divRatioTbl[n] = preComputeDiv_u32_v1(n);
    }

    FILE * fp = fopen("div_ratio_tbl32_v1.h", "w");
    if (fp == NULL) return;

    fprintf(fp, "\n");
    fprintf(fp, "static const DivRatio32_v1 div_ratio_tbl32_v1[kMaxDivTable] = {\n");
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        if ((n % 2) == 0) {
            fprintf(fp, "    ");
        }
        fprintf(fp, "{ /* %3u */ 0x%08X, %2u },",
                    n,
                    divRatioTbl[n].inverse,
                    divRatioTbl[n].shift);
        if ((n % 2) == 1) {
            fprintf(fp, "\n");
        } else {
            fprintf(fp, " ");
        }
    }
    fprintf(fp, "};\n");

    fclose(fp);
}

static inline
void genDivRatioTbl_u32_v2()
{
    DivRatio32 divRatioTbl[kMaxDivTable];
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        divRatioTbl[n] = preComputeDiv_u32<2>(n);
    }

    FILE * fp = fopen("div_ratio_tbl32_v2.h", "w");
    if (fp == NULL) return;

    fprintf(fp, "\n");
    fprintf(fp, "static const DivRatio32 div_ratio_tbl32_v2[kMaxDivTable] = {\n");
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        if ((n % 2) == 0) {
            fprintf(fp, "    ");
        }
        fprintf(fp, "{ /* %3u */ 0x%08X, 0x%08X, %2u, 0 },",
                    n,
                    divRatioTbl[n].inverse,
                    divRatioTbl[n].bias,
                    divRatioTbl[n].shift);
        if ((n % 2) == 1) {
            fprintf(fp, "\n");
        } else {
            fprintf(fp, " ");
        }
    }
    fprintf(fp, "};\n");

    fclose(fp);
}

static inline
void genDivRatioTbl_u32()
{
    DivRatio32 divRatioTbl[kMaxDivTable];
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        divRatioTbl[n] = preComputeDiv_u32<0>(n);
    }

    FILE * fp = fopen("div_ratio_tbl32.h", "w");
    if (fp == NULL) return;

    fprintf(fp, "\n");
    fprintf(fp, "static const DivRatio32 div_ratio_tbl32[kMaxDivTable] = {\n");
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        if ((n % 2) == 0) {
            fprintf(fp, "    ");
        }
        fprintf(fp, "{ /* %3u */ 0x%08X, 0x%08X, %2u, 0 },",
                    n,
                    divRatioTbl[n].inverse,
                    divRatioTbl[n].bias,
                    divRatioTbl[n].shift);
        if ((n % 2) == 1) {
            fprintf(fp, "\n");
        } else {
            fprintf(fp, " ");
        }
    }
    fprintf(fp, "};\n");

    fclose(fp);
}

static inline
void genDivRatioTbl_u32_64()
{
    DivRatio32 divRatioTbl[kMaxDivTable];
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        divRatioTbl[n] = preComputeDiv_u32_64(n);
    }

    FILE * fp = fopen("div_ratio_tbl32_64.h", "w");
    if (fp == NULL) return;

    fprintf(fp, "\n");
    fprintf(fp, "static const DivRatio32 div_ratio_tbl32_64[kMaxDivTable] = {\n");
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        if ((n % 2) == 0) {
            fprintf(fp, "    ");
        }
        fprintf(fp, "{ /* %3u */ 0x%08X, 0x%08X, %2u, 0 },",
                    n,
                    divRatioTbl[n].inverse,
                    divRatioTbl[n].bias,
                    divRatioTbl[n].shift);
        if ((n % 2) == 1) {
            fprintf(fp, "\n");
        } else {
            fprintf(fp, " ");
        }
    }
    fprintf(fp, "};\n");

    fclose(fp);
}

static inline
void genDivRatioTbl_u64()
{
    DivRatio64 divRatioTbl[kMaxDivTable];
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        divRatioTbl[n] = preComputeDiv_u64(n);
    }

    FILE * fp = fopen("div_ratio_tbl64.h", "w");
    if (fp == NULL) return;

    fprintf(fp, "\n");
    fprintf(fp, "static const DivRatio64 div_ratio_tbl64[kMaxDivTable] = {\n");
    for (std::uint32_t n = 0; n < kMaxDivTable; n++) {
        if ((n % 1) == 0) {
            fprintf(fp, "    ");
        }
        fprintf(fp, "{ /* %3u */ 0x%08X%08Xull, 0x%08X%08Xull, %2u, 0 },",
                    n,
                    (uint32_t)(divRatioTbl[n].inverse >> 32u),
                    (uint32_t)(divRatioTbl[n].inverse & 0xFFFFFFFFul),
                    (uint32_t)(divRatioTbl[n].bias >> 32u),
                    (uint32_t)(divRatioTbl[n].bias & 0xFFFFFFFFul),
                    divRatioTbl[n].shift);
        if ((n % 1) == 0) {
            fprintf(fp, "\n");
        } else {
            fprintf(fp, " ");
        }
    }
    fprintf(fp, "};\n");

    fclose(fp);
}

static inline
void genDivRatioTbl()
{
    genDivRatioTbl_u32_v1();
    genDivRatioTbl_u32_v2();
    genDivRatioTbl_u32();
    genDivRatioTbl_u32_64();
    genDivRatioTbl_u64();
}

static inline
std::uint32_t fast_div_u32_v1(std::uint32_t value, std::uint32_t divisor)
{
    if (divisor < kMaxDivTable) {
        DivRatio32_v1 rt = div_ratio_tbl32_v1[divisor];
        std::uint32_t result = ((std::uint32_t)(((std::uint64_t)value * rt.inverse) >> 32u) >> rt.shift);
        return result;
    } else {
        return (value / divisor);
    }
}

static inline
std::uint32_t fast_div_u32_v2(std::uint32_t value, std::uint32_t divisor)
{
    if (divisor < kMaxDivTable) {
        DivRatio32 rt = div_ratio_tbl32_v2[divisor];
        std::uint32_t result = ((std::uint32_t)(((std::uint64_t)value * rt.inverse + rt.bias) >> 32u) >> rt.shift);
        return result;
    } else {
        return (value / divisor);
    }
}

#if defined(WIN64) || defined(_WIN64) || defined(_M_X64) || defined(_M_AMD64) \
 || defined(_M_IA64) || defined(__amd64__) || defined(__x86_64__)

static inline
std::uint32_t fast_div_u32(std::uint32_t value, std::uint32_t divisor)
{
    if (divisor < kMaxDivTable) {
        DivRatio32 rt = div_ratio_tbl32_64[divisor];
        std::uint32_t result = (std::uint32_t)(((std::uint64_t)value * rt.inverse + rt.bias) >> rt.shift);
        return result;
    } else {
        return (value / divisor);
    }
}

#else // !__amd64__

static inline
std::uint32_t fast_div_u32(std::uint32_t value, std::uint32_t divisor)
{
    if (divisor < kMaxDivTable) {
        DivRatio32 rt = div_ratio_tbl32[divisor];
        std::uint32_t result = ((std::uint32_t)(((std::uint64_t)value * rt.inverse + rt.bias) >> 32u) >> rt.shift);
        return result;
    } else {
        return (value / divisor);
    }
}

#endif // __amd64__

static inline
std::uint64_t fast_div_u64(std::uint64_t value, std::uint64_t divisor)
{
    if (divisor < kMaxDivTable) {
        DivRatio64 rt = div_ratio_tbl64[divisor];
        std::uint64_t result = (mul_u64x64_high_ex(value, rt.inverse) >> rt.shift);
        return result;
    } else {
        return (value / divisor);
    }
}

} // namespace jstd

#endif // JSTD_FAST_DIV_H
